【发布时间】:2014-10-08 09:09:11
【问题描述】:
我将 nginx 用于具有客户端证书身份验证的 Web 服务器。配置的相关部分是:
ssl_certificate /usr/local/etc/nginx/certs/ssl.crt;
ssl_certificate_key /usr/local/etc/nginx/certs/ssl.key;
ssl_client_certificate /usr/local/etc/nginx/certs/server_chain.crt;
ssl_verify_client on;
ssl_verify_depth 2;
客户端证书由具有根 CA 证书的另一台服务器签名。即,我想接受具有如下证书链的客户端:
CA -> intermediate CA -> client
因此文件 server_chain.crt 由:
cat intermediate_ca.crt root_ca.crt > server_chain.crt
现在,我可以通过发出命令成功访问服务器了:
openssl s_client -connect localhost:443 -tls1 -cert client.crt \
-key client.key -CApath root_ca.crt -state -debug`
然后输入GET /api
但如果我尝试通过以下方式获得相同的服务:
curl -v -s -k --key client.key --cert client.crt https://localhost/api
我明白了:
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.6.0</center>
</body>
</html>
我也无法从安装了客户端证书的网络浏览器访问localhost/api 页面。如果我关闭客户端验证,它会起作用。
有什么想法吗?
【问题讨论】:
-
您使用 OpenSSL 调用文件
client.*,使用 cURL 调用文件cert.*。这只是这个问题的错字,还是您实际上没有使用相同的文件?我还怀疑 cURL 可能不会将任何客户端证书发送到它不信任的服务器证书。我可能也值得将您的 CA 证书与 cURL 一起使用,而不是-k。 -
命名只是一个错字,对不起。但我肯定会尝试其他的东西。谢谢。