我们目前有一台运行 Tomcat 8.5 的 Ubuntu 服务器,它托管来自不同域的两个网站。这是一个奇怪的情况,但长话短说,我们需要为其中一个站点禁用 SSL,并保持另一个站点的 SSL 正常运行。此服务器目前有一个 IP 地址。这两个站点名称的结构如下:
site1.a.net
site2.a.com
我们想禁用 site1.a.net 的 SSL,并保持 site2.a.com 的 SSL 启用。这在 Tomcat 8.5 中可行吗?
答案1
[为了不使用任何注册域名,我们使用site1.example.net
和site2.example.com
],仅用于文档目的。]
从 HTTPS 重定向到 HTTP 的工作原理与从 HTTP 重定向到 HTTPS 的工作原理相同,但略有不同:当客户端打开时https://site1.example.net
,服务器必须提供受信任的 TLS 证书site1.example.net
前任何重定向都是可能的。如果不这样做,浏览器就会出现安全警告。我会为此使用 Let's Encrypt 证书。
否则,你只需要<Host>
在你的 中配置两个 s <Engine>
,在你的 中配置两个<Certificate>
s <Connector>
。你的site1.example.com
主机需要一个RewriteValve
来执行重定向:
<Service name="Catalina">
<!-- HTTP connector -->
<Connector port="80" redirectPort="443"/>
<!-- HTTPS connector -->
<!-- If the client does not use SNI it ends up with site1.example.net certificate -->
<Connector port="443" SSLEnabled="true" scheme="https" secure="true"
defaultSSLHostConfigName="site1.example.net">
<SSLHostConfig hostName="site1.example.net">
<Certificate certificateFile="conf/site1.example.net.crt" certificateKeyFile="conf/site1.example.net.key" />
</SSLHostConfig>
<SSLHostConfig hostName="site2.example.com">
<Certificate certificateFile="conf/site2.example.com.crt" certificateKeyFile="conf/site2.example.com.key" />
</SSLHostConfig>
</Connector>
<!-- If a client doesn't send a Host: header or puts the IP in the Host: header it ends up on site1.example.net -->
<Engine defaultHost="site1.example.net" name="Catalina">
<Host appBase="webapps/site2.example.com" name="site2.example.com">
...
</Host>
<Host appBase="webapps/site1.example.net" name="site1.example.net">
<!-- We need it for the redirect -->
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
</Host>
</Engine>
</Service>
为了配置RewriteValve
你只需要创建一个conf/Catalina/site1.example.net/rewrite.config
包含内容的文件
# If the client connected through HTTPS
RewriteCond %{HTTPS} on
# Temporarily redirect to the HTTP version
RewriteRule ^ http://site1.example.net%{REQUEST_PATH} [R,L]