Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssl 使用2个中间CA进行nginx客户端身份验证_Ssl_Nginx_Https_Certificate_Client Certificates - Fatal编程技术网

Ssl 使用2个中间CA进行nginx客户端身份验证

Ssl 使用2个中间CA进行nginx客户端身份验证,ssl,nginx,https,certificate,client-certificates,Ssl,Nginx,Https,Certificate,Client Certificates,我正试图让nginx使用自签名根验证通过以下链颁发的客户端证书:root CA=>Signing CA=>substance CA=>client cert 我在服务器上安装了root_CA.crt,在客户端,证书与cat client.crt substance_CA.crt signing_CA.crt>cert chain.pem连接。我的nginx设置如下所示: ssl_client_certificate /path/to/root_CA.crt; ssl_verify_client

我正试图让nginx使用自签名根验证通过以下链颁发的客户端证书:root CA=>Signing CA=>substance CA=>client cert

我在服务器上安装了root_CA.crt,在客户端,证书与
cat client.crt substance_CA.crt signing_CA.crt>cert chain.pem
连接。我的nginx设置如下所示:

ssl_client_certificate /path/to/root_CA.crt;
ssl_verify_client on;
ssl_verify_depth 3;
我试图连接
curl-k服务器。url:443--cert-cert-chain.pem
,但它给了我错误
curl:(35)读取X.509密钥或证书文件时出错
。如果我用
--key client.key
尝试,那么它会给我
400个错误请求。我还尝试使用
openssl s_client
进行测试,结果类似


我已经验证,如果我没有中间CA,即根CA=>客户端证书,nginx设置可以工作。如果我的中间CA证书安装在服务器上,并且客户端只有叶证书,nginx设置也可以工作。然而,在我们的例子中,不能提前在服务器上安装签名CA和从属CA证书。知道下一步要尝试什么吗?

我发现curl无法正确发送中间证书,即使它们包含在pem(或.p12)文件中

您可以通过对流向服务器(tcpdump-a…dst端口443)的流量进行数据包捕获来验证这一点。您将能够在捕获中看到证书主题和问题的文本形式。您将看到客户机证书(subject及其直接的中间颁发者),但在链的上游没有看到任何内容

尝试使用openssl s_客户端验证:

openssl s_client -connect www.example.com:443 -cert client.crt -key client.key -CAFile cert-chain.pem 
和类型:

GET / HTTP/1.0<return>
<return>
GET/HTTP/1.0

我最终很好地使用了基于openssl构建的curl 7.52.1(即目前在debian stable中可用的curl版本)

我需要将我的发行链的两个.cer合并为一个:

cat caroot.cer caissuing.cer > cachain.cer
(顺序很重要,根证书必须是第一个,然后是依赖于早期证书的任何证书,等等)

以及我的私人客户端密钥和签名的pem:

cat private.key private.pem > private-combined.pem
然后,我可以通过以下方式访问服务器:

curl --cacert cachain.cer --cert-type pem --cert private-combined.pem
(我尝试的每一种组合都失败了,因为curl、openssl或服务器出现了各种各样的错误。)