配置SSL双向认证的CA证书链时,其中最关键的两步骤:
- ssl_client_certificate ca.crt; # 包含证书链的ca.crt
- ssl_verify_depth 2; # 指定双向认证客户端证书到根证书的深度,默认是1
配置如下:
# HTTPS server
#
server {
listen 443 ssl;
listen 8110 ssl;
server_name aaa.abc.com;
ssl on;
ssl_certificate /usr/local/nginx/cert/server.crt; #配置证书位置
ssl_certificate_key /usr/local/nginx/cert/server.key; #配置秘钥位置
#包含证书链的ca
ssl_client_certificate /usr/local/nginx/cert/ca.crt; #双向认证
#或者把ca链拆开,分成root_ca.crt和sub_ca.crt,如下(注意属性名):
#ssl_client_certificate /usr/local/nginx/cert/sub_ca.crt; #双向认证
#ssl_trusted_certificate /usr/local/nginx/cert/root_ca.crt; #双向认证
ssl_verify_client on; #双向认证
ssl_verify_depth 2; #指定双向认证客户端证书到根证书的深度,默认是1
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
#ssl_ciphers HIGH:!aNULL:!MD5;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root /usr/local/abc/abc_web;
index index.html index.htm;
}
location /abcApi {
proxy_pass http://aaa.abc.com:8119;
}
}
如果CA证书是没有证书链的话(vim打开之后可以直接查看,里面只有rootCA信息,没有subCA信息),则配置ssl_verify_depth值为1,或者直接去掉,因为默认是1。而ssl_client_certificate 值还是ca.crt,只不过这个ca.crt文件里面没有证书链。
补充:
从pfx文件导出ca证书链(这样导出的ca.crt文件是root根证书和sub子证书合在一起的)
openssl pkcs12 -in myssl.pfx -cacerts -nokeys -out ca.crt
参考自: