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

sun*_*985 39 linux https curl certificate request-headers

卷曲命令:

curl -k -vvvv --request POST --header "Content-Type: application/json" --cert client.pem:password --key key.pem "https://test.com:8443/testing"
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用上面指定的Curl命令发送客户端证书.我想知道以下内容:

  1. 什么是HTTP请求标头,我应该在服务器端查看从HTTP请求中提取客户端证书.

  2. 如果我无法从HTTP请求中提取服务器端的客户端证书,我是否可以在HTTP请求中添加自定义请求标头,并将客户端证书作为该自定义标头的值发送.如果有人能为我提供这种方法的一个例子,那就太好了.

rea*_*lin 102

我就这样做了:

curl -v \
  --cacert ./ca.pem \
  --key ./admin-key.pem \
  --cert ./admin.pem \
  https://xxxx/api/v1/
Run Code Online (Sandbox Code Playgroud)

  • 我使用这个答案来卷曲一个需要相互 TLS 身份验证才能连接的 API,它的工作就像一个魅力。在我的例子中,我不需要“cacert”参数。 (4认同)
  • 这里需要“cacert”吗?这并不能真正帮助服务器验证客户端的“证书/密钥”对;服务器必须已经具有相关的“cacert”(否则,提供密钥、证书和 cacert 与自签名证书没有什么不同,自签名证书不提供任何身份验证,对吧?)。我的猜测是 _server_ 身份验证需要它?主要是因为我不确定我是否理解了所有内容并且想知道我是否误解了某些内容! (3认同)
  • 如果 Web 服务器使用的 CA 和客户端证书之间存在 CA,则可能需要 cacert。例如,如果有一家 X Ltd 公司拥有“X Ltd CA”,该公司已为“X - IT 部门”签署了 CA,并且“X - IT 部门”已使用“X Ltd CA”的基础 CA 签署了 10 个证书,如果服务器没有“X - IT Dept”CA,则客户端需要发送该CA。 (2认同)

fra*_*ale 29

不在HTTP标头中发送TLS客户端证书.它们由客户端作为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 他正在尝试发送证书并询问如何发送。答案是解释服务器如何处理它。解释什么是正确方法的部分在哪里? (18认同)