Apache httpd代理至SSL启用的Tomcat时出现连接不安全错误
针对你遇到的ERR_SSL_PROTOCOL_ERROR错误,结合配置文件分析,核心问题及修复方案如下:
1. Apache客户端SSL配置缺失关键指令
你的VirtualHost仅启用了SSLProxyEngine on(用于反向代理HTTPS后端),未启用给客户端提供HTTPS服务的SSLEngine On指令;若全局未配置Listen 8000,Apache也不会在8000端口监听SSL请求。浏览器发起HTTPS请求时,Apache无法完成SSL握手,直接触发协议错误。
修正后的VirtualHost配置(需确保全局已添加Listen 8000):
# 全局配置(如httpd.conf) Listen 8000 <VirtualHost *:8000> ServerName domain1.com # 启用客户端SSL连接 SSLEngine On ProxyPreserveHost On SSLProxyEngine on SSLCertificateFile /app/certs/domain1.com.crt SSLCertificateKeyFile /app/certs/domain1.com.key SSLCertificateChainFile /app/certs/domain1.com.pem ProxyPass / https://123.45.67.89:8444/ connectiontimeout=300 timeout=300 ProxyPassReverse / https://123.45.67.89:8444/ </VirtualHost>
2. 访问端口不匹配
你配置Apache监听8000端口,但直接访问domain1.com时,浏览器默认使用HTTPS的443端口或HTTP的80端口,而非8000端口。未做端口映射或DNS未指定端口时,浏览器无法连接到Apache的目标端口,引发SSL错误。
解决方式:
- 访问时显式指定端口:
https://domain1.com:8000 - 或配置Apache监听标准HTTPS端口443,将VirtualHost改为
<VirtualHost *:443>并更新对应配置。
3. 后端Tomcat证书域名不匹配
ProxyPass使用IP地址123.45.67.89:8444连接Tomcat,但Tomcat的证书是签发domain1.com的,Apache验证后端证书时会触发域名不匹配,导致转发失败,间接引发客户端SSL错误。
解决方式(三选一):
- 生产环境:给Tomcat证书添加该IP作为SAN(备用名称),或使用域名连接Tomcat(确保Apache能解析该域名到Tomcat服务器),修改ProxyPass为
https://domain1.com:8444/ - 测试环境:临时关闭Apache后端证书验证(不建议生产使用),添加以下指令:
ProxyPass / https://123.45.67.89:8444/ connectiontimeout=300 timeout=300 ProxyPassReverse / https://123.45.67.89:8444/ # 临时关闭后端证书验证 SSLProxyVerify none SSLProxyCheckPeerCN off
- 信任Tomcat证书:将Tomcat证书导入Apache信任库,确保Apache信任该证书。
4. Tomcat Host配置不匹配
启用ProxyPreserveHost On后,客户端的Host头(domain1.com)会被转发到Tomcat,如果Tomcat的server.xml中<Host>节点的name属性不是domain1.com,Tomcat无法正确处理请求,导致返回错误影响SSL连接。
检查Tomcat的server.xml配置:
<Host name="domain1.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 其他配置 --> </Host>
内容的提问来源于stack exchange,提问作者vinayawsm

