最近在做一个项目,有个接口安全性要求比较高,所以要用到双向认证,就开始究了一下具体搭建
具体是参考这里:http://blog.csdn.net/kunoy/article/details/8239653
遇到的问题作一下笔记
主要是双向认证问题,很多分享都是基于整个域名访问都是双向认证的,但是很多时候,我们开发可能只是某个路由或某个接口下才需要双向认证
很多的分享只要加上 ssl_verify_client on; ssl_client_certificate ca.crt; 实现的,达不到我们只是局部接口才需要双向认证的,下面就是完整解决办法 主要是 ssl_verify_client optional; 这个选项
ssl_verify_client
语法:ssl_verify_client on|off|optional
默认值:ssl_verify_client off
使用字段:main, server
启用客户端证书审核,参数“optional”在客户端主动提出时检查证书(0.8.7与0.7.63版本之前为"ask")。
也在一些社区看到的提示
path based client ssl verification is messy as it requires the client/server to do a (secure) renegotiation.
You’re better off doing a separate domain or make it ssl_verify_client optional at the top level and check the compliance at application level.
最后在location 里加上
location /test {
if ($ssl_client_verify != 'SUCCESS') {
return 403;
break;
}
return 200 "success";
}
server {
listen 443;
server_name xxx.xx.com;
ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_client_certificate ca.crt;
ssl_session_timeout 30m;
ssl_verify_client optional;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location /test {
if ($ssl_client_verify != 'SUCCESS') {
return 403;
break;
}
return 200 "success";
}
location / {
root html; #站点目录
index index.html index.htm;
}
}
如果还有同学有更好的方法,也可以交流一下