我正在try 使用Curl命令调用具有相互TLS的服务.

使用的Curl命令:

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

我试图找出以下几点:

  1. 为了从HTTP请求中取出客户端证书,我应该查看服务器端的HTTP请求头是什么?

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

推荐答案

当使用相互TLS时,客户端发送TLS证书.

在相互TLS握手中,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;
    }
}

Linux相关问答推荐

与mmap和munmap相比,保留一个巨大内存文件(约400 MB)的mmap多次的性能成本

使用sed替换字符,但如果它是在bash csv文件中的字符串中,则不使用

Docker 不保留 chown 用户设置

Linux 上 Ada 任务优先级的语义是什么?

通过 ssh 在远程计算机上按索引访问数组元素

Git在某些文件中添加回车符,尽管autocrlf已关闭

命令行中使用`..`为什么会导致权限被拒绝错误?

如何添加Linux格式的时间输出

什么命令用于在linux中创建或修改具有指定文件大小的多个文件

根据文件名对目录中的文件进行 chgrp

Linux中没有X.org的OpenGL

如何使目录下的所有文件在linux上可读?

如何克隆 OpenLDAP 数据库

C.UTF-8 和 en_US.UTF-8 语言环境有什么区别?

将 AWK 结果分配给变量

如何从命令行打开 Ubuntu Linux 上的 AVD 管理器?

以原子方式移动目录

可以通过 SSH 连接的所有用户的列表

svn over HTTP 代理

当我已经 ssh 进入远程机器时,如何 scp 回到本地?