在Curl命令中使用客户端证书


71

卷曲命令:

curl -k -vvvv \
  --request POST \
  --header "Content-Type: application/json" \
  --cert client.pem:password \
  --key key.pem \
  "https://test.com:8443/testing"

我正在尝试使用上面指定的Curl命令发送客户端证书。我试图了解以下内容:

  1. 我应该在服务器端查看的HTTP请求标头是什么,以从HTTP请求中拉出客户端证书。

  2. 如果无法从HTTP请求中拉出服务器端的客户端证书,可以在HTTP请求中添加自定义请求标头,然后将客户端证书作为该自定义标头的值发送。如果有人可以为我提供这种方法的示例,那就太好了。

Answers:


37

TLS客户端证书不在HTTP标头中发送。它们是作为TLS握手的一部分由客户端传输的,并且服务器通常还将在握手期间检查证书的有效性。

如果接受了证书,则可以将大多数Web服务器配置为添加标头,以将证书或证书中包含的信息传输到应用程序。环境变量使用ApacheNginx中的证书信息填充,这些信息可在其他指令中用于设置标头。

作为此方法的示例,以下Nginx配置片段将验证客户端证书,然后设置SSL_CLIENT_CERT标头以将整个证书传递给应用程序。在成功验证证书后才设置此设置,因此应用程序可以随后解析证书并依赖其所包含的信息。

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/chainedcert.pem;  # server certificate
    ssl_certificate_key /path/to/key;          # server key

    ssl_client_certificate /path/to/ca.pem;    # client CA
    ssl_verify_client on;
    proxy_set_header SSL_CLIENT_CERT $ssl_client_cert;

    location / {
        proxy_pass http://localhost:3000;
    }
}

4
他正在尝试发送证书并询问如何发送。答案是解释服务器如何处理它。哪里解释了正确的方法?
Akshay Hiremath

166

这是我的方法:

curl -v \
  --key ./admin-key.pem \
  --cert ./admin.pem \
  https://xxxx/api/v1/

3
这是cacert必需的吗?这实际上并不能帮助服务器验证客户端cert/key对。服务器必须已经具有相关cacert证书(否则,提供密钥,证书和cacert与不提供任何身份验证的自签名证书没有区别,对吗?)。我的猜测是服务器身份验证是否需要它?主要是因为我不确定我是否了解所有内容,并且想知道我是否误解了一些东西!
dwanderson

2
如果Web服务器使用的CA和客户端证书之间存在CA,则可能需要cacert。例如,如果某公司X Ltd拥有其“ X Ltd CA”,该公司已为“ X-IT部门”签署了CA,而“ X-IT部门”已使用“ X Ltd CA”的基础CA签署了10个证书,则客户端需要发送“ X-IT Dept” CA(如果服务器没有)。
Rudy Broersma

4
我使用此答案来卷曲需要相互TLS身份验证才能连接的API,它的工作原理像一个魅力。我不需要cacert我的情况下的参数。
罗布·卡彭特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.