Tomcat 使用 https 处理多个域

问题描述

我有一个 Tomcat 安装 server.xml 并且正在尝试处理多个域。

这是一个 Linux 安装,使用 Apache 代理对 Tomcat 的请求。

<Connector port="8223" protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https" secure="true"
               keystoreFile="/root/keystore.jks" 
               keystorePass="xxx" clientAuth="false" sslProtocol="TLS"
               SSLEnabled="true" proxyPort="443"/>

当密钥库文件具有单个域的条目时 - 它可以工作。

我试图附加另一个域 - 但它不起作用。第一个仍然可以。

有什么帮助吗?

添加

现在在域的 Apache conf 文件中,我有一个用于 https 连接的 VirtualHost 并且有

SSLProxyEngine On

ProxyPreserveHost On
ProxyPass         /xxx  https://localhost:8227/xxx
ProxyPassReverse  /xxx  https://localhost:8227/xxx

我应该把它改成??

ProxyPreserveHost On
ProxyPass         /xxx  http://localhost:8226/xxx
ProxyPassReverse  /xxx  http://localhost:8226/xxx

一个 http 连接器正在监听 8226。

正确吗?

解决方法

从 Tomcat 8.5 开始,每个连接器都有多个证书(参见 migration guide)。

但是,在您的情况下,我没有看到加密 Apache Httpd 和 Tomcat 之间的通信有任何安全优势:除非我弄错了,否则它们在同一台主机上并且所有通信都通过环回设备,而不是真正的网络接口。

编辑:发往 Apache 服务器的 HTTP 和 HTTPS 都可以转发到同一个纯文本 <Connector>。为了让Tomcat区分这两种类型的请求,需要配置Apache发送X-Forwarded-Proto头:

RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}

并将 RemoteIpValve 添加到 <Engine><Host> 配置块:

<Valve className="org.apache.catalina.valves.RemoteIpValve" />

(参见documentation)。使用最新的 7.0 服务器(7.0.94 版之后),您无需修改​​任何 <Valve> 的默认参数。