在Nginx 配置文件中开启客户端证书校验需要下面一段配置。(未贴出全部nginx.conf)
server{
listen 444 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA,;
ssl_certificate /test/signcert.pem;
ssl_certificate_key /test/signprivate.pem;
ssl_verify_client on;
# 指定客户端证书到根证书的深度 多ca情况下以最大深度为准
ssl_verify_depth 2;
# 允许客户端访问的CA合集 向客户端发送
ssl_client_certificate /test/cert/clientCertificate.pem;
ssl_session_cache shared:SSLSTREAM:1m;
ssl_session_timeout 5m;
ssl_session_tickets off;
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass PROTECT;
proxy_protocol on;
}
在我测试中发现ssl_verify_client 开启校验时ssl_verify_depth,ssl_client_certificate 参数都需要存在。
ssl_trusted_certificate这个参数在官方文档介绍中是不向客户端发送证书链。
地址:http://nginx.org/en/docs/http/ngx_http_ssl_module.html
这是ssl_client_certificate 的解释。
一开始总是以为ssl_trusted_certificate和ssl_client_certificate 是互斥操作,但后来看了另一篇文章了解到ssl_trusted_certificate 是与ocsp 验证相关的,与ssl_stapling 参数或许有关。但未验证正确性。
参考文章地址:https://blog.csdn.net/vencent7/article/details/79190249
下面主要说一下ssl_client_certificate 这个配置项,该项需要将允许的CA集合放入到一个文件里面,在之前调研时好像还有其它实现方式,因为本次只是调研任务故我只测试了这一种情况。将两个CA的pem证书同时放入到目标地址文件中,文件内容如下。
(图一)
文件中存在两个CA,一个是二级CA和它的一级CA的组合(二级CA我这里命名叫“OCA” 它的一级CA我叫它“RCA”),另一个是单独的一级CA(我命名叫“RCA for SIGN”),分别用“OCA”和“RCA for SIGN” 签发下级证书,签发出p12格式的证书后再导入到本地中。这里将jin1.p12(OCA签发出来的)和jin3.p12(OCA签发出来的),ojin.p12导入(RCA for SIGN 签发出来的)。
导入之后可以在浏览器中查看。
将“OCA” “RCA” 和“RCA for SIGN” 原格式为p12的根证转换为pem格式的文件再存入到/test/cert/clientCertificate.pem中。如图一所示格式:需要含头含尾,必须是标准的格式,不能有空行出现, 不然启动时报错。我的放入顺序为“OCA” 放前“RCA” 放后,“RCA for SIGN”放在最后。
之后启动nginx,访问444端口,查看效果。