同一Tomcat实例关联双域名,如何实现重定向并解决SSL证书告警
嘿,我之前刚好处理过一模一样的场景,咱们一步步来搞定SSL告警和域名重定向的问题:
首先得明确核心问题:你访问https://app.bar.com时的SSL告警,根源是443端口的Tomcat只装了app.foo.com的证书,证书域名和请求域名不匹配,浏览器肯定会告警。要彻底解决这个,最靠谱的方案是用多域名SSL证书,如果实在拿不到,再用变通方案。
方案一:使用SAN证书(推荐,彻底解决问题)
这是最优解,能同时消除告警和实现平滑重定向:
- 先申请一张包含
app.foo.com和app.bar.com的SAN证书(Subject Alternative Name,多域名证书)——如果两个域名属于同一主域名,通配符证书也可以,但这里是不同主域名,SAN更合适。 - 把这个证书替换掉443端口Tomcat实例里原来的SSL证书,更新
server.xml里的<Connector>配置:<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/your-san-cert.jks" type="RSA" /> </SSLHostConfig> </Connector> - 在443的Tomcat的
server.xml里配置两个<Host>节点,分别处理两个域名:<!-- 主域名app.foo.com的正常配置 --> <Host name="app.foo.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 这里保留你原来的Context、Valve等配置 --> </Host> <!-- app.bar.com的Host,配置重定向到app.foo.com --> <Host name="app.bar.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 使用RewriteValve实现重定向 --> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve"> <Property name="rewrite.config" value="${catalina.base}/conf/rewrite-bar.config"/> </Valve> </Host> - 在
conf/rewrite-bar.config里添加重定向规则(永久重定向301,对SEO友好):
如果你觉得配置rewrite文件麻烦,也可以用RewriteCond %{HTTP_HOST} ^app\.bar\.com$ [NC] RewriteRule ^(.*)$ https://app.foo.com$1 [R=301,L]RedirectValve简化:<Host name="app.bar.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.RedirectValve" redirectHost="app.foo.com" redirectPort="443" redirectProtocol="https"/> </Host>
方案二:无法获取多域名证书的变通方案
如果实在拿不到覆盖两个域名的证书,那只能通过HTTP重定向来避免用户触发SSL告警:
- 在监听80端口的Tomcat实例里,配置两个
<Host>节点,分别处理两个域名的HTTP请求:<!-- 把app.foo.com的HTTP请求重定向到HTTPS --> <Host name="app.foo.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.RedirectValve" redirectPort="443" redirectProtocol="https"/> </Host> <!-- 直接把app.bar.com的HTTP请求重定向到app.foo.com的HTTPS --> <Host name="app.bar.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.RedirectValve" redirectHost="app.foo.com" redirectPort="443" redirectProtocol="https"/> </Host> - 额外处理:如果用户手动输入
https://app.bar.com,还是会弹告警,但你可以在443的Tomcat里也配置一个Host,让告警后自动重定向:
对应的rewrite规则和方案一一样,但这个只能是兜底,因为用户还是会先看到告警。<Host name="app.bar.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve"> <Property name="rewrite.config" value="${catalina.base}/conf/rewrite-bar-fallback.config"/> </Valve> </Host>
总结
- 优先选方案一,用SAN证书彻底解决SSL告警和重定向问题,体验最好。
- 方案二是退而求其次的变通,能覆盖大部分正常访问场景,但无法阻止用户手动输入HTTPS地址触发告警。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

