使用s_client但不是curl的客户端证书访问服务器?

时间:2014-08-14 16:11:28

标签: curl ssl nginx openssl

我使用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>

我也无法从安装了客户端证书的Web浏览器访问localhost/api页面。如果我关闭客户端验证,那就有用了。

关于什么是错的任何想法?

3 个答案:

答案 0 :(得分:3)

好的,所以错误与nginx完全无关。原来,在OS X上,curl没有默认运行ssl的引擎。因此,curl从未向服务器发送过任何证书。

答案 1 :(得分:1)

从那时起,这可能已经发生了变化,但截至今天,已安装的curl 可以使用客户端证书。但是因为它链接到Mac OS的SSL库,所以有几个问题:

  1. 证书需要采用PKCS12格式。您可以使用以下内容转换您拥有的内容:

    cat client.key client.crt intermediate_ca.crt&gt; bundle.pem openssl pkcs12 -export -in bundle.pem -out bundle.p12

  2. 使用“--cert bundle.p12:密码”选项运行curl

  3. showstopper gotcha。 curl或底层库 NOT 正确发送中间证书:仅发送客户端证书。您可以通过数据包捕获对进入服务器的数据包进行验证:发布者和主题名称以明文形式显示。

答案 2 :(得分:0)

您可以尝试指定路径吗?旧版本的curl似乎有一些错误:

curl -v -s -k --key ./client.key --cert ./client.crt https://localhost/api

https://help.mulesoft.com/s/article/Received-No-required-SSL-certificate-was-sent-Error-Sending-a-Request-Via-Client-Certificate-Enabled-DLB-Due-to-Curl-Version