具有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(代码片段