Nginx 怎么使用不被信任的 CA 验证客户端证书?

2018-08-01 09:59:01 +08:00
 xudzhang

下面的配置里,ca.crt 是一个 untrusted 的 CA,当用 ca.crt 来验证客户端的证书时,Nginx 的 error log 里提示 unable to verify the first certificate,错误码是 21。但其实我用 openssl 命令行用 ca.crt 校验客户端证书是 OK 的。哪位高人指点下怎么解决?

server {
    listen 443 ssl;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    server_name www.example.com;
    ssl_certificate server.crt;
    ssl_certificate_key server.key;

    ssl_verify_client on;
    ssl_client_certificate ca.crt;
}
6224 次点击
所在节点    NGINX
26 条回复
msg7086
2018-08-01 16:38:34 +08:00
@xudzhang 你看看 Nginx 编译用的是哪个 OpenSSL,是系统自带的还是静态链接了别的版本?
Hardrain
2018-08-01 21:46:36 +08:00
@xudzhang 很抱歉,我恐怕很难透过这些信息提供帮助

我检索了 nginx+{错误信息中的数字*}(其余的信息似乎都是 x.509 证书的一些字段),但无法找到任何有帮助的结果。
客户端有什么错误出现?
你可以尝试从客户端 /服务器抓一下包吗?

*:debug 6024|9450|error:7 等
Hardrain
2018-08-01 21:53:16 +08:00
@xudzhang
检索 openssl 和 error 7 得到一结果,或有帮助:
https://serverfault.com/questions/653144/openssl-verify-error-7-at-1-depth-lookupcertificate-signature-failure
从这篇问答来看似乎是用户证书签名问题。

使用`openssl x509 -in {path_to_client_cert} -noout -text`看一下客户端证书所用签名算法。
另外,用`openssl verify -CAfile {path_to_client_verify_ca} {path_to_client_cert}`测试下签发的证书有无问题。
xudzhang
2018-08-02 10:26:18 +08:00
@Hardrain 找到 root cause 了,是 openssl 版本的问题,client 使用的签名算法在高版本中的 openssl 已经废弃……
xierch
2018-08-02 12:09:03 +08:00
> ssl_client_certificate specifies a file with trusted CA certificates in the PEM format used to verify.

他其实是说,你需要指定一个证书作为 trusted CA …
然后这个 trusted CA 用 ssl_client_certificate 来指定…
owt5008137
2018-08-02 13:39:01 +08:00
@xudzhang 我贴的地址里有两个文件。一个是执行脚本的.sh 另一个就是 openssl.cnf

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/475834

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX