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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有2个中间CA的nginx客户端身份验证相关的知识,希望对你有一定的参考价值。

我正在尝试让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证书。知道下一步该尝试什么吗?

答案

我发现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>
另一答案

我最终得到了很好的工作与针对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或服务器的各种无用错误而失败。)

以上是关于具有2个中间CA的nginx客户端身份验证的主要内容,如果未能解决你的问题,请参考以下文章

X.509 客户端身份验证的 Apache + mod_ssl 中间 CA 自动发现

Express实战 - 应用案例- realworld-API - 路由设计 - mongoose - 数据验证 - 密码加密 - 登录接口 - 身份认证 - token - 增删改查API(代码片段

WCF与相互身份验证

相互 SSL - 多少身份验证就足够了?

如何在具有 ca 证书的元数据库中添加 MongoDB 以进行身份​​验证

Azure 中的客户端证书身份验证和 CA 证书