转载

Nginx 配置 TLSv1.2 协议失效的问题

①、背景描述

所有业务出口都挂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浏览器都是正常返回了。 640  
正文到此结束
Loading...