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

curl命令:

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请求中添加一个自定义请求标头,并将该客户端证书作为该自定义标头的值发送。 如果有人能为我提供一个这种方法的例子,这将是非常好的。

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

如果证书被接受,大多数Web服务器都可以配置为添加标题,用于将证书或包含在证书中的信息传输到应用程序。 环境变量在Apache和Nginx中用证书信息填充,可以在其他指令中用于设置标题。

作为这种方法的一个例子,下面的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; } } 

这是我如何做到的:

curl -v –cacert ./ca.pem –key ./admin-key.pem –cert ./admin.pem https:// xxxx / api / v1 /