3.3 端口、协议与TLS配置实战


文档摘要

3.3 端口、协议与 TLS 配置实战 本节摘要:城门的开法不止一种。本节实战三件事:多端口监听与端口冲突处置、从证书生成到连接器挂载的 HTTPS 全流程、AJP 专用协议的适用前提与它的安全红线。每一步都配可复现的命令会话与配置片段,做完你将得到一个 HTTP 与 HTTPS 双开、经得起基本安全检查的实例。 进城段的最后一步是把连接器接到真实网络。前两节认识了部件与工作制度,本节全是动手:装门(端口)、加锁(TLS)、开内网专线(AJP)。这些配置在第 7 章安全加固时还会回来复查。 从一扇门到多扇门 默认安装只开 8080 一扇门,真实环境往往要多开。常见的门有五扇,先认清各自的用途与默认值。

3.3 端口、协议与 TLS 配置实战

本节摘要:城门的开法不止一种。本节实战三件事:多端口监听与端口冲突处置、从证书生成到连接器挂载的 HTTPS 全流程、AJP 专用协议的适用前提与它的安全红线。每一步都配可复现的命令会话与配置片段,做完你将得到一个 HTTP 与 HTTPS 双开、经得起基本安全检查的实例。

进城段的最后一步是把连接器接到真实网络。前两节认识了部件与工作制度,本节全是动手:装门(端口)、加锁(TLS)、开内网专线(AJP)。这些配置在第 7 章安全加固时还会回来复查。

从一扇门到多扇门

默认安装只开 8080 一扇门,真实环境往往要多开。常见的门有五扇,先认清各自的用途与默认值。

端口 用途 协议 生产建议
8080 应用流量入口 HTTP 有前置代理时只绑内网
8443 加密流量入口 HTTPS 对外服务的正门
8009 与 Apache HTTP Server 对接 AJP 不用就删,用则必限源
8005 管理通道关闭端口 专用字符串 改默认值并封网段
48080 第二实例示例 任意 多实例时的规划位

多开一扇门就是多写一个 Connector 标签。假设要让应用同时响应明文与加密流量,两扇门共存。

<!-- server.xml:HTTP 与 HTTPS 双开 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="200" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/keystore.p12" certificateKeystorePassword="changeit" type="RSA"/> </SSLHostConfig> </Connector>

redirectPort 的用意藏在明文门上:应用里声明了传输保障为机密的表单或页面,被明文请求命中时,容器会把请求重定向到 8443——这扇门不开,重定向就成了死路。改端口时的冲突处置在 2.1 预演过:日志末尾 BindException 定位占用者,改自己的或停别人的,没有第三条路。

给城门加锁:HTTPS 全流程

三步走:生成密钥对、(正式环境换成机构签发的证书)、挂到连接器。先用自签证书把流程跑通,再讲生产替换。

# 第一步:用 keytool 生成自签证书 存为 PKCS12 格式 keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -validity 365 \ -keystore conf/keystore.p12 -storetype PKCS12 -storepass changeit \ -dname "CN=shop.example.com, OU=Ops, O=Example, L=Beijing, ST=Beijing, C=CN" # 第二步:重启后验证握手与协议版本 curl -vk https://localhost:8443/ 2>&1 | grep -E 'subject|SSL connection|HTTP/'
* subject: CN=shop.example.com * SSL connection using TLSv1.3 > GET / HTTP/1.1 < HTTP/1.1 200

握手成功、协商出 TLS 1.3,锁就装好了。生产环境的差别只在证书来源:向机构申请后你会拿到一对文件,转成 PKCS12 导入密钥库,或者直接用 PEM 格式三行配置挂载。

<!-- 生产替换:PEM 格式证书直接挂载 --> <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="200"> <SSLHostConfig protocols="TLSv1.2,TLSv1.3"> <Certificate certificateFile="conf/cert.pem" certificateKeyFile="conf/key.pem" type="RSA"/> </SSLHostConfig> </Connector>

三个细节别漏掉。protocols 属性显式列白名单,等于顺手关掉老旧协议版本,扫描器最爱揪 TLSv1 与 TLSv1.1;正式证书的域名要与访问域名一致,否则握手能过、浏览器报红;密钥文件的权限收窄到运行账户只读,第 7 章安全清单会复查这一项。

⚠️ 常见坑:证书换了但浏览器仍报警,八成是连接器引用的还是旧 keystore 路径,或者开了多个 SSLHostConfig 但只更新了一个。验证永远用 curl 的握手输出说话,别信浏览器缓存。

内网专线:AJP 的正确打开方式

AJP 是 Tomcat 与 Apache HTTP Server 之间的二进制协议,比 HTTP 解析开销小、连接可复用,当年"HTTPD 处理静态、Tomcat 处理动态"的黄金组合靠它连接。今天 Nginx 一族不 speak AJP,它的存在感大不如前,但存量架构里仍会碰到。

配置本身极简。

<!-- server.xml:AJP 连接器 必须限定来源 --> <Connector port="8009" protocol="AJP/1.3" secretRequired="true" secret="内网约定的密钥" address="127.0.0.1" maxThreads="200"/>

重点是后面三个属性,它们全部指向一条安全红线:AJP 面向可信内网,绝不裸奔公网。历史上有名的 Ghostcat 漏洞(CVE-2020-1938)就是 AJP 端口暴露后被借道读取应用文件,任意来源可达的 8009 等于把城门钥匙挂在门外。默认配置从 Tomcat 9.0.31 起已经收紧(监听回环地址且要求密钥),升级旧实例时要专门检查这扇门是否还按老习惯开着。确认不用 AJP 就整段删掉——少一扇门少一份风险,这条原则贯穿第 7 章的安全加固。

验收清单

  • 双门可通:明文 8080 返回 200,加密 8443 握手协商到 TLS 1.3。
  • 重定向闭环:访问需要加密的页面,浏览器被正确引到 8443 而非死路。
  • 门禁到位:8009 只在确有 HTTPD 对接时存在,且限地址、带密钥;8005 的关闭口令已改。
  • 证书可追溯:keystore 或 PEM 路径、别名、到期日记录在运维文档,到期前一个月有提醒。

本节要点回顾

  • 多门并存靠多个 Connector:明文门上的 redirectPort 决定加密重定向是否闭环。
  • TLS 三步:生成(或申请)证书、挂 SSLHostConfig、用 curl 握手输出验证协议版本。
  • 协议白名单顺手关旧版本:protocols 属性显式写 TLSv1.2 与 TLSv1.3。
  • AJP 是内网专线:secretRequired 加 address 限定是底线,不用就删,Ghostcat 是前车之鉴。
  • 验收以命令输出为准:握手日志与状态码比浏览器界面更可信。

城门段到此走完。请求手里已经有了签证(TLS 解密后的明文请求对象),下一章进迷宫——四层容器如何把它精确送到目的地。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U