问题描述
我有一个 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>
的默认参数。