EC2 Tomcat搭配ELB的SSL证书问题:无法自定义域名时如何对齐
我在EC2上部署了Tomcat服务器,搭配应用负载均衡器(ELB),需要提供TLS加密。该Tomcat承载的应用通过自定义域名www.mydomain.com/somebusiness访问。我已在ELB上安装了AWS提供的证书,但443端口到Tomcat服务器的流量无法使用该AWS证书,因此需要为Tomcat单独配置另一张证书。我尝试使用自签名证书,但持续收到"您的连接不是私密连接,攻击者可能试图窃取您的信息……"的提示,因此转而使用CA签名证书,希望解决该问题。但真正的问题随之而来:我的证书是针对www.mydomain.com颁发的,安装到ELB后,ELB仍使用https://blappity.amazon.aws.com这个DNS名称,导致证书因域名不匹配而验证失败。由于不可避免的原因,我无法为负载均衡器设置自定义DNS名称,这也排除了使用Route 53的可能。在此情况下,我该如何将自定义域名与ELB对齐?
核心思路:拆分TLS加密链路
既然无法给ELB配置自定义域名,要解决证书不匹配问题,必须调整加密链路的分工:让ELB负责处理外部用户的TLS验证,Tomcat只处理内部流量的加密(或明文传输),避免两端证书域名冲突。
1. 配置ELB终止外部TLS
- 保留ELB上针对
www.mydomain.com的AWS证书,确保ELB的HTTPS(443端口)监听使用该证书。 - 配置ELB的监听规则:将
www.mydomain.com/somebusiness的请求转发到Tomcat所在的目标组,转发协议根据需求选择以下两种方案。
2. 两种Tomcat侧配置方案
方案A:ELB到Tomcat用HTTP(简单高效)
- 修改Tomcat的
server.xml,确保Connector监听8080端口(HTTP协议),无需配置SSL相关内容:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> - 配置EC2安全组:允许ELB所在的安全组访问8080端口。
- 优势:无需维护Tomcat证书,配置简单,VPC内部流量安全性足够(私有子网内传输)。
方案B:ELB到Tomcat用内部TLS(合规要求场景)
- 生成针对EC2私有IP或内部域名(如
ip-10-0-0-1.ec2.internal)的自签证书:keytool -genkeypair -alias tomcat-internal -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore tomcat-internal.p12 -validity 3650 -dname "CN=ip-10-0-0-1.ec2.internal, OU=Internal, O=MyOrg, L=City, ST=State, C=US" - 修改Tomcat的
server.xml,添加HTTPS Connector:<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/tomcat-internal.p12" type="RSA" certificateKeystorePassword="你的证书密码"/> </SSLHostConfig> </Connector> - 配置ELB目标组:将协议改为
HTTPS,端口设为8443,开启TLS验证并导入自签证书的CA根证书(从tomcat-internal.p12中导出)。 - 配置EC2安全组:允许ELB访问8443端口。
- 优势:ELB到Tomcat的流量加密,满足合规要求,且浏览器不会感知内部自签证书(只和ELB验证证书)。
问题根源说明
你之前的错误在于:把针对www.mydomain.com的证书装到Tomcat后,ELB用自身域名blappity.amazon.aws.com请求Tomcat,导致Tomcat返回的证书域名与请求域名不匹配,触发验证失败。拆分加密链路后,外部用户只和ELB验证www.mydomain.com的证书,ELB和Tomcat之间用适配内部场景的证书或明文,彻底规避域名冲突问题。
内容的提问来源于stack exchange,提问作者SriniMurthy

