外部应用HTTPS访问Apache httpd 2.4.48出现PKIX路径构建失败问题
问题根因
1. Apache SSL配置指令误用
你使用的Apache httpd 2.4.48属于2.4.8之后的版本,SSLCertificateChainFile指令已经正式废弃,该指令配置的证书链不会被Apache加载生效,导致服务端TLS握手时仅返回了server.crt对应的服务端叶子证书,没有返回完整的中间证书链:
- 浏览器通常内置了大量公共CA的中间证书、根证书,或有之前访问其他站点缓存的中间证书,可以自动补全证书链完成验证,所以访问正常
- 报错的外部应用是Java开发的,Java运行环境的默认信任库
cacerts不会自动补全缺失的中间证书,无法构建完整的信任路径,就会抛出PKIX path building failed错误
2. 证书用途配置混淆
你当前将外部应用的证书放在了原本用于服务端证书链的配置位置,逻辑完全错误:
SSLCertificateChainFile(已废弃)的作用是配置服务端自身的证书链,用于发送给客户端验证服务端身份- 如果你的站点需要开启双向TLS认证(即服务端也要验证客户端的身份),需要单独用
SSLCACertificateFile指令指向存放客户端信任锚证书的文件
修复步骤
第一步:修复服务端证书链配置
将你的服务端中间证书、根证书按顺序追加到server.crt文件末尾,顺序要求为:服务端叶子证书在前,紧接着是签发它的中间证书,再往上是更上级的中间证书,根证书可选择不追加(客户端信任对应根证书的话会自行匹配)。调整后的Apache配置可以删除废弃的SSLCertificateChainFile行:
<VirtualHost {SystemIP}:{somePort}> ServerName abc.org.com ErrorLog /www/home/logs/error_log SSLEngine on SSLCertificateFile /home/apache/http/ssl/server.crt SSLCertificateKeyFile /home/apache/http/ssl/server.key ... </VirtualHost>
修改后重启Apache生效,可自行验证服务端返回的证书链是否完整。
第二步:按需配置外部应用证书
- 若为单向TLS(仅客户端验证服务端身份,服务端不需要验证客户端):Web服务端不需要存储外部应用的证书,只需要让外部应用运维人员将服务端证书链的根证书导入到Java运行环境的
cacerts信任库,或在应用启动参数中指定自定义信任库即可。 - 若为双向TLS(服务端也需要验证客户端身份):新增如下配置,将外部应用的证书、对应的根/中间证书存放到
SSLCACertificateFile指向的文件中即可:
# 开启客户端认证 SSLVerifyClient require SSLVerifyDepth 10 # 指向存放信任的客户端证书、根/中间证书的bundle文件 SSLCACertificateFile /home/apache/http/ssl/client-truststore.crt
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

