①、背景描述
所有业务出口都挂Nginx上,Nginx配置了证书但是通过https访问时谷歌浏览器、火狐、Edge浏览器报错,提示正在使用已过时的SSL版本,v1.0,建议使用v1.2或更高版本。
②、原因分析:
访问的域名得Nginx配置是设置的
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
度娘“nginx 证书v1.2失效”得知nginx配置了N多vhost,只要有其中一个配置文件配置了过时的ssl_protocols 那么所有的配置都会使用过时的版本。
检查Nginx配置
server
{
listen 443 ssl;
server_name granfa.example.com;
# ssl on; //如果同时使用http和https,这个不要打开,注意
ssl_certificate /usr/local/nginx/conf/cert/3893973__example.com.pem;
ssl_certificate_key /usr/local/nginx/conf/cert/3893973__example.com.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1; #就是这行配置造成的问题。
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://granfa;
allow 118.113.15.13;
allow 10.20.11.0/24;
allow 220.166.180.0/24;
deny all;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
access_log /usr/local/nginx/logs/granfa_443.log mainlog_post;
}
③、解决思路
3.1、查看Nginx所有vhost配置文件配置的ssl_protocols 值。
可以看到有很多配置还是使用的v1、v2、v3
[root@nginx-180-master-180 vhost_backup]# grep -rin "ssl_protocols" ./
./testmixingren.example.com.conf:18: ssl_protocols SSLv2 SSLv3 TLSv1;
./testfdd.example.com.conf:21: ssl_protocols SSLv2 SSLv3 TLSv1;
./testbtpay.example.com.conf:22: ssl_protocols SSLv2 SSLv3 TLSv1;
./maven.example.com.conf:29: ssl_protocols TLSv1.1 TLSv1.2; # 支持的协议
./j.example.com.conf:18: ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
./j.example.com.conf:19: #ssl_protocols TLSv1.1 TLSv1.2; # 支持的协议
./granfa.example.com.conf:29: ssl_protocols SSLv2 SSLv3 TLSv1;
./ab.example.com.conf:18: ssl_protocols SSLv2 SSLv3 TLSv1;
./alipaytest.example.com.conf:28: ssl_protocols SSLv2 SSLv3 TLSv1;
./testweburl.example.com.conf:22: ssl_protocols SSLv2 SSLv3 TLSv1;
./testnewrisk.example.com.conf:29: ssl_protocols SSLv2 SSLv3 TLSv1;
./testbaolifund.example.com.conf:22: ssl_protocols SSLv2 SSLv3 TLSv1;
./testpaymiddle.example.com.conf:21: ssl_protocols SSLv2 SSLv3 TLSv1;
./elk.example.com.conf:17: ssl_protocols TLSv1.1 TLSv1.2; # 支持的协议
./testmonth.example.com.conf:22: ssl_protocols SSLv2 SSLv3 TLSv1;
./testmiddle.example.com.conf:21: ssl_protocols SSLv2 SSLv3 TLSv1;
./testrisk3.example.com.conf:21: ssl_protocols SSLv2 SSLv3 TLSv1;
./testacs.example.com.conf:30: ssl_protocols SSLv2 SSLv3 TLSv1;
./testlogs.example.com.conf:21: ssl_protocols SSLv2 SSLv3 TLSv1;
./j.example.com.conf_backup:29: ssl_protocols SSLv2 SSLv3 TLSv1;
./testcmprofit.example.com.conf:22: ssl_protocols SSLv2 SSLv3 TLSv1;
./testcps3.example.com.conf:21: ssl_protocols SSLv2 SSLv3 TLSv1;
./testrisk2.example.com.conf:29: ssl_protocols SSLv2 SSLv3 TLSv1;
3.2 替换所有低版本为v1.2
低版本:sl_protocols SSLv2 SSLv3 TLSv1
高版本:ssl_protocols TLSv1 TLSv1.1 TLSv1.2
sed -i "s/ssl_protocols SSLv2 SSLv3 TLSv1/ssl_protocols TLSv1 TLSv1.1 TLSv1.2/g" `grep -rl 'ssl_protocols SSLv2 SSLv3 TLSv1' ./`
3.3重新加载nginx配置
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
3.4再次通过浏览器访问https站点
经测试谷歌浏览器、Egde浏览器、360浏览器都是正常返回了。