具有2个中间CA的nginx客户端身份验证

问题描述 投票:1回答:2

我正在尝试让nginx验证通过以下链发出的客户端证书,使用自签名root:Root CA => Signing CA => Subordinate CA => Client cert。

我在服务器上安装了root_CA.crt,在客户端,证书与cat client.crt subordinate_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 server.url:443 --cert cert-chain.pem连接,但它给了我错误curl: (35) error reading X.509 key or certificate file。如果我尝试使用--key client.key然后它给了我400 Bad Request。我也尝试用openssl s_client测试,结果是类似的。

我已经验证了如果我没有中间CA,即nginx设置有效,即Root CA => Client cert。如果我的中间CA证书安装在服务器上并且只有叶证书在客户端,它也可以工作。但是,在我们的示例中,无法提前在服务器上安装签名CA和从属CA证书。知道下一步该尝试什么吗?

ssl nginx https certificate client-certificates
2个回答
1
投票

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

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

尝试使用openssl s_client来验证:

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

并输入:

GET / HTTP/1.0<return>
<return>

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或服务器的各种无用错误而失败。)

© www.soinside.com 2019 - 2024. All rights reserved.