我正在使用 NGINX Web 服务器。配置我的网站,使用以下设置,当用户第一次向网站发出请求时,需要出示证书:
ssl_client_certificate /path/to/ca/cert/ca.crt;
ssl_verify_client on;
当用户访问该网站时,系统会提示他出示证书。但在选择证书后,他收到以下消息:
400 Bad Request
The SSL certificate error
nginx/1.12.2
访问日志显示: "GET / HTTP/2.0" 400 633 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36"
错误日志显示: client SSL certificate verify error: (2:unable to get issuer certificate) while reading client request headers, client: 190.130.110.5, server: $xyz.net, request: "GET / HTTP/2.0", host:
跑步openssl verify -CAfile /etc/nginx/certs/ca.crt /etc/nginx/certs
导致以下错误:
unable to load certificate
140622725740432:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:707:Expecting: TRUSTED CERTIFICATE
我对 NGINX 还很陌生,缺乏想法。请帮忙。
答案1
您的客户端必须向服务器出示链中除根 CA 之外的所有证书。
如果您的客户端是浏览器,它必须能够访问颁发客户端证书的 CA 证书以及所有其他中间 CA 证书(但不一定包括根 CA 证书)。
当使用 OpenSSL 等命令行工具时,客户端证书文件必须是一组证书,它以客户端证书开始并按顺序包含所有其他 CA 证书,直到但不一定包括根 CA 证书。
在这两种情况下,发送根是可选的,但没有任何用处。
欲了解更多信息,请阅读RFC 5246 第 7.4.6 节,指的是第 7.4.2 节和certificate_list
结构。