Ssl 使用2个中间CA进行nginx客户端身份验证
我正试图让nginx使用自签名根验证通过以下链颁发的客户端证书:root CA=>Signing CA=>substance CA=>client cert 我在服务器上安装了root_CA.crt,在客户端,证书与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
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或服务器出现了各种各样的错误。)