在 Apache Web 服务器上配置 2 路 SSL 客户端身份验证
Posted
技术标签:
【中文标题】在 Apache Web 服务器上配置 2 路 SSL 客户端身份验证【英文标题】:Configuring 2 way SSL Client authentication on Apache web server 【发布时间】:2013-06-02 18:57:54 【问题描述】:想就设置简单的 2 路 apache SSL 获得一些建议。
我们使用 openSSL 创建了一个密钥文件和 csr 请求。然后我们将其提交给 CA 并收到一个带有 CA 的 crt 文件的 crt 文件。
我们已经配置了 apache http.conf 文件,并在加载 mod_ssl 模块后添加了以下参数。
SSLEngine 开启
SSLCACertificateFile /local/fast/fcHome/deployment/apache01/conf/ssl.crt/ca.crt - 随证书收到的 CA 根证书
SSLCertificateFile /local/fast/fcHome/deployment/apache01/conf/ssl.crt/server.crt - 从 CA 收到的用于服务器的 crt 文件
SSLCertificateKeyFile /local/fast/fcHome/deployment/apache01/conf/ssl.key/server.key - 用于生成 csr 的密钥文件
SSLVerifyClient 需要
SSLVerifyDepth 10
然后,我们有一个客户端也在使用由同一 CA 签名的证书尝试连接到 https 服务。客户端在连接时遇到 SSL 握手错误。
apache 错误日志显示如下:
ssl_engine_kernel.c(1884):OpenSSL:写入:SSLv3 读取客户端证书 B ssl_engine_kernel.c(1903):OpenSSL:退出:SSLv3 读取客户端证书 B 中的错误 ssl_engine_kernel.c(1903):OpenSSL:退出:SSLv3 读取客户端证书 B 中的错误 SSL 库错误:336105671 错误:140890C7:SSL 例程:SSL3_GET_CLIENT_CERTIFICATE:peer 没有返回证书 服务器没有已知的 CA 用于验证?
我似乎无法弄清楚这是为什么。是否有可能即使客户端证书是由 Versign 签名的,但它与服务器的 CA.crt 文件不匹配?
任何帮助将不胜感激
【问题讨论】:
你有没有想过这个问题?是服务器端的东西,还是客户端的东西? 【参考方案1】:SSLCACertificateFile 必须包含您客户的证书颁发机构证书以及任何中间证书文件,所有这些文件串联在一起。
您还缺少 SSLCertificateChainFile,它必须指向一个包含您服务器的证书颁发机构证书以及任何中间证书文件的文件,所有这些文件都连接在一起。
显然,客户端(浏览器)必须安装自己的客户端证书。
注意:从 2.4.8 版本开始,作为官方 apache 文档,SSLCertificateChainFile 已过时(感谢 ezra-s 的评论)。现在可以将服务器证书和 CA 中间证书直接连接到 SSLCertificateFile。
【讨论】:
对于现在检查的任何人,在 2021 年,现在在 apache 中不推荐使用 SSLCertificateChainFile,签署服务器证书的 CA 必须与 SSLCertificateFile 中的服务器证书本身连接。由于答案来自 2013 年,因此这里发布的答案没有什么可纠正的,但这个问题仍然引起了一些关注,所以我认为有更新的评论值得添加。干杯。【参考方案2】:客户端必须提供客户端证书才能连接到服务器。
例如在python中:
import requests
cert = (client_cert_file_path, client_key_file_path)
resp = requests.get(url, cert=cert, verify=False)
【讨论】:
以上是关于在 Apache Web 服务器上配置 2 路 SSL 客户端身份验证的主要内容,如果未能解决你的问题,请参考以下文章