【问题标题】:Access server with client certificate using s_client but not curl?使用 s_client 但不使用 curl 的客户端证书访问服务器?
【发布时间】: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
  • 命名只是一个错字,对不起。但我肯定会尝试其他的东西。谢谢。

标签: curl ssl nginx openssl


【解决方案1】:

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

【讨论】:

  • 我也在 Ubuntu 16.04 上使用 curl 7.47.0 遇到了这个问题。但是,CentOS 7 可以很好地与 curl 7.29.0
【解决方案2】:

从那时起这可能已经改变,但从今天开始,安装的 curl 可以使用客户端证书。但因为它链接到 Mac OS 的 SSL 库,所以存在一些问题:

  1. 证书需要采用 PKCS12 格式。您可以使用以下方式转换您所拥有的:
     cat client.key client.crt intermediate_ca.crt > bundle.pem
     openssl pkcs12 -export -in bundle.pem -out bundle.p12
  1. 使用 --cert bundle.p12:*password* 选项运行 curl

  2. 最引人注目的陷阱。 curl 或底层库都正确发送中间证书:只发送客户端证书。您可以通过对发往服务器的数据包进行数据包捕获来验证这一点:发布者和主题名称以明文形式显示。

【讨论】:

    【解决方案3】:

    您可以尝试指定路径吗?旧版本的 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

    【讨论】:

    • 是的,这个“错误”吸引了我。 curl 7.29.0* warning: certificate file name "client.crt" handled as nickname; please use "./client.crt" to force file name* NSS: client certificate not found: client.crt
    猜你喜欢
    • 1970-01-01
    • 2013-06-16
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多