在Apache Web服务器上配置双向SSL客户端身份验证

时间:2013-06-06 16:44:14

标签: web-services apache ssl

想要获得一些关于设置简单的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:对等方未返回证书服务器是否已知CA以进行验证?

我似乎无法弄清楚为什么会这样。即使客户证书是由Versign签名的,它是否可能与服务器的CA.crt文件不匹配?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

SSLCACertificateFile 必须包含您的客户端的证书颁发机构证书以及任何中间证书文件,所有这些都连接在一起。

您还缺少 SSLCertificateChainFile ,它必须指向包含服务器的证书颁发机构证书和任何中间证书文件的文件,这些文件都连接在一起。

显然,客户端(浏览器)必须安装自己的客户端证书。

答案 1 :(得分:0)

客户端必须提供客户端证书才能连接到服务器。

例如python中的

import requests

cert = (client_cert_file_path, client_key_file_path)

resp = requests.get(url, cert=cert, verify=False)