关于SSL认证后出现的http和https无法同时访问问题
--痛苦是人最好的试金石 Pain is man's best litmus test
问题:
我现在在我的Tomcat上面加了一个SSL 认证,但是我就是指认证了一个xxx.xxx.com的域名,我其他的域名 也在同一个server.xml配置文件中,现在xxx.xx.com可以https可以使用了,但是我的其他域名连http也无法访问了 怎么回事
答:
当你在 Tomcat 上配置 SSL 认证时,如果配置不当,可能会导致其他域名无法正常访问。以下是可能的原因和解决方法:
1. 端口冲突
- 确保你的
server.xml
文件中,SSL 配置使用了一个单独的端口(通常是 443),而非默认的 HTTP 端口(通常是 8080 或 80)。如果 SSL 配置端口和 HTTP 配置端口冲突,会导致 HTTP 服务无法正常工作。- 检查
<Connector>
元素的port
属性,确认 SSL 和 HTTP 配置分别使用不同的端口。2. 虚拟主机配置冲突
- 如果你在
server.xml
中为xxx.xxx.com
配置了一个<Host>
元素,但没有为其他域名单独配置<Host>
,可能会导致这些域名没有正确的虚拟主机配置。- 确保为每个域名都配置了相应的
<Host>
元素,或者使用defaultHost
属性指定默认的虚拟主机。3. SSL 配置中的
redirectPort
设置
- Tomcat 的 SSL 配置中可能设置了
redirectPort
,导致所有 HTTP 请求都被重定向到 HTTPS。检查server.xml
中的<Connector>
配置,看是否设置了redirectPort
,并确保它与 SSL 端口一致。- 如果你不希望其他域名被强制重定向到 HTTPS,可以为这些域名单独配置一个
<Host>
,并在<Connector>
中确保没有设置redirectPort
。4. 检查日志文件
- 检查 Tomcat 的日志文件(如
catalina.out
),看看是否有关于启动过程中出现的错误或警告。这些日志信息通常可以帮助你找出问题所在。5. SSL 配置的
keyAlias
和keystore
- 如果你为
xxx.xxx.com
配置了 SSL 证书,可能在<Connector>
中使用了keyAlias
或keystore
来指定特定的证书。如果这影响了其他域名的访问,可以考虑为不同的域名配置单独的<Connector>
元素,或者检查是否可以调整证书配置来兼容多个域名。解决步骤:
- 先确保你的
server.xml
中,为每个域名配置了独立的<Host>
元素。- 检查
Connector
元素,确保 HTTP 和 HTTPS 使用不同的端口,并且redirectPort
设置合理。- 尝试在 Tomcat 日志中查找更多信息,以便更好地定位问题。
从你提供的 server.xml
配置文件中,可以看出你为域名 xxx.xxx.com
配置了 SSL,但在配置上有几个潜在的问题可能导致其他域名无法访问 HTTP 服务。以下是详细分析和建议:
1. 端口配置问题
- 你将
Connector
配置在443
端口上,并且启用了 SSL。这意味着这个端口只接受 HTTPS 请求。如果其他域名没有配置 SSL 证书,它们将无法通过 HTTPS 访问。 - 而且你没有配置一个单独的 HTTP 端口(例如默认的
8080
或80
端口),这会导致非 HTTPS 请求没有对应的处理端口,因而无法访问。
2. 未配置 HTTP Connector
- 如果你希望其他域名继续使用 HTTP 访问,建议你在
server.xml
中添加一个非 SSL 的 HTTPConnector
。例如,使用默认的 8080 端口: xml复制代码
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
3. redirectPort
配置
- 在现有的 HTTPS
Connector
中,你设置了redirectPort="8443"
,但其实你并没有配置这个端口。这个设置通常用于将 HTTP 请求重定向到 HTTPS,但在这个情况下,它可能会引起混乱。如果你不打算使用8443
端口,可以移除redirectPort
属性,或者确保 HTTP 连接器的redirectPort
配置正确。
4. SSL 证书与多个域名
- 当前 SSL 证书只适用于
xxx.xxxx.com
,如果其他域名需要使用 HTTPS,它们需要各自的 SSL 证书,或者你需要一个支持多个域名(SAN)的 SSL 证书。
解决方法:
-
添加 HTTP
Connector
:- 在
<Service name="Catalina">
内添加一个新的 HTTPConnector
,例如: xml复制代码
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
- 这样,未配置 SSL 的域名可以通过 HTTP 访问。
- 在
-
调整
redirectPort
设置:- 根据你是否需要将 HTTP 请求重定向到 HTTPS,选择保留或移除
redirectPort
。
- 根据你是否需要将 HTTP 请求重定向到 HTTPS,选择保留或移除
-
为其他域名配置 SSL:
- 如果希望其他域名也支持 HTTPS,你需要为它们配置相应的 SSL 证书,并在
server.xml
中为它们添加 SSLConnector
。
- 如果希望其他域名也支持 HTTPS,你需要为它们配置相应的 SSL 证书,并在
调整后,你的 server.xml
可能会如下所示(添加了 HTTP 连接器):
xml
复制代码
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" /> <Connector port="443" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxParameterCount="1000" SSLEnabled="true" scheme="https" secure="true" keystoreFile="conf/xxx.xxxx.com.jks" keystoreType="JKS" keystorePass="s1qgn5cp" clientAuth="false" SSLProtocol="TLSv1.1+TLSv1.2+TLSv1.3" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>
请根据你的实际需求和证书配置调整 server.xml
文件。完成这些修改后,重启 Tomcat 并测试各域名的访问情况。