本站早先启用了HTTPS+HTTP2,现在也支持TLSv1.3,更多了解TLSv1.3,可以查看WIKI

这篇文章仅记录过程。

环境:

  1. CentOS7.4

  2. 存在yum安装的nginx,版本是1.14;系统的openssl版本是1.0.2k(这俩是之前启用H2时升级的)

启用TLSv.13思路:

核心就是让nginx和openssl支持。目前 Nginx 1.13 以上的版本支持 TLS 1.3 版本,而 OpenSSL 1.1.1 版本支持 TLS 1.3 版本。

所以版本要大于上面两个即可。

虽然nginx版本到了,但是由于yum安装的,又不升级系统本身的openssl,所以只能卸载再编译安装nginx。

步骤:

升级时间是2019-02-27,当天nginx最新版本是nginx-1.15.9,openssl最新版本是1.1.1b

  1. 下载、编译、安装
cd /usr/local/src/
yum install -y wget jemalloc jemalloc-devel
wget https://www.openssl.org/source/openssl-1.1.1b.tar.gz
wget http://nginx.org/download/nginx-1.15.9.tar.gz
tar zxf openssl-1.1.1b.tar.gz
tar zxf nginx-1.15.9.tar.gz
cd nginx-1.15.9
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --with-stream --with-stream_ssl_module --with-openssl=../openssl-1.1.1b --with-openssl-opt='enable-tls1_3 enable-weak-ssl-ciphers' --with-ld-opt=-ljemalloc
make
make install
  1. 卸载原有nginx并更新新的nginx配置

不需要yum安装的nginx了,卸载就行,省的回头不小心乱了,同时将配置文件迁移到新的中,要修改使其支持TLSv1.3。

修改的地方:

  • ssl on,去掉,改为listen 443 ssl http2,为什么?

    nginx1.15.0更改的。不然会触发如下警告:

    nginx: [warn] the “ssl” directive is deprecated, use the “listen … ssl” directive instead in /usr/local/nginx/conf/xx.conf:7

  • 协议和加密套件的配置(个人示例):

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

  • 注意!所有支持HTTPS的配置文件都要更新协议和加密套件使其支持TLSv1.3,否则单个不生效!

    我碰到了这个问题,后来查到这篇文章,修改了所有的解决问题。

  1. 验证
  • 可以到https://myssl.com/验证HTTPS的网站

  • Chrome、Firefox等现代浏览器支持了TLSv1.3,我用的chrome72.0.3626.119,F12打开开发者工具-Security,如图:

    企业微信截图_20190228102911

附录:

    1. 给编译安装的nginx一个系统服务脚本:centos7centos6或5
    1. nginx ssl配置完整示例:
server {
    listen 80;
    listen 443 ssl http2;
    server_name xxx;
    charset utf-8;
    access_log /var/log/nginx/access.log main;

    ssl_certificate certs/full_chain.pem;
    ssl_certificate_key certs/private.key;
    #OCSP Stapling开启,OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高TLS握手速度
    ssl_stapling on;
    #OCSP Stapling验证开启
    ssl_stapling_verify on;
    #用于查询OCSP服务器的DNS
    resolver 8.8.8.8 114.114.114.114 valid=300s;
    #查询域名超时时间
    resolver_timeout 5s;
    #SSL优化配置
    #Session Cache,将Session缓存到服务器,这可能会占用更多的服务器资源
    ssl_session_cache builtin:1000 shared:SSL:10m;
    #开启浏览器的Session Ticket缓存
    ssl_session_tickets on;
    #SSL session过期时间
    ssl_session_timeout  10m;
    #只启用 TLS 系列协议
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    #加密套件,这里用了CloudFlare's Internet facing SSL cipher configuration
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
    #由服务器协商最佳的加密算法
    ssl_prefer_server_ciphers on;
    #开启HSTS,并设置有效期为9460800秒(9个月),包括子域名(根据情况可删掉):includeSubdomains,预加载到浏览器缓存(根据情况可删掉)
    add_header Strict-Transport-Security "max-age=15768001; preload";

    #禁止被嵌入框架
    #add_header X-Frame-Options DENY;
    #防止在IE9、Chrome和Safari中的MIME类型混淆攻击
    add_header X-Content-Type-Options nosniff;
    #处理静态资源:
    location ~ ^\/static\/.*$ {
        root /xxx;
        access_log off;
    }
    location / {
       proxy_pass http://127.0.0.1:110;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

·End·