在自己的网站部署TLS 1.3

前不久Go 1.12 发布,对TLS 1.3 作初步支持,对使用Go 开发的后台来说,这是一个很好的消息。但要启用TLS 1.3 必须添加一个编译参数 GODEBUG=tls13=1,等Go 1.13 就默认支持。

为什么要升级到TLS 1.3?从第三方比较数据看,TLS 1.3 握手时间会减半,即比TLS 1.2 少用100ms。

下面对常见几个后端部署环境启用TLS 1.3 做一下记录

Nginx + OpenSSL

版本要求:TLS 1.3 要求 Nginx 1.13+,OpenSSL 1.1.1+

这里 Nginx,我个人推荐 1.15+,因为 1.14 虽然已经能支持TLS1.3了,但是一些 TLS1.3 的进阶特性还只在 1.15+ 中提供。

目前Nginx 最新版本是 1.15.9 ,OpenSSL 最新版本是 1.1.1b

参见

用最新版本都很方便编译

OpenSSL

首先查看当前的openssl 版本

$ openssl version
OpenSSL 1.0.2g  1 Mar 2016

肯定是很老的版本,下载最新稳定版+打补丁

wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1b.zip
unzip OpenSSL_1_1_1b.zip
cd openssl-OpenSSL_1_1_1b

curl https://raw.githubusercontent.com/hakasenyang/openssl-patch/master/openssl-1.1.1b-chacha_draft.patch | patch -p1

./config
make install

再看看新版本:

openssl version

如果出现下面错误:

openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

就拷贝两个文件:

cp /usr/local/lib/libssl.so.1.1 /lib/x86_64-linux-gnu
cp /usr/local/lib/libcrypto.so.1.1 /lib/x86_64-linux-gnu

删除旧的,建立软链:

mv /usr/bin/openssl /tmp/
ln -s /usr/local/bin/openssl /usr/bin/openssl

Nginx

wget http://nginx.org/download/nginx-1.15.9.tar.gz
tar -zxvf nginx-1.15.9.tar.gz
cd nginx-1.15.9

./configure --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module

make
make install

http 配置

events {
    worker_connections  1024;
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    client_max_body_size 100M;
    client_body_buffer_size 100M;

    gzip  on;
    gzip_min_length 1k;
    gzip_comp_level 2;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\."; 
}

server 配置,关键部分:

    listen                       443 http2;

    # TLS 1.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;
    ssl_prefer_server_ciphers    on;
    ssl_protocols                TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_session_cache            shared:SSL:50m;
    ssl_session_timeout          1d;
    ssl_session_tickets          on;
    ssl_early_data               on;

    location / {
        proxy_set_header Early-Data $ssl_early_data;
    }

Caddy

Caddy 确实是简单易用的服务,可以直接从官网下载最新版

也可以本地自己编译:

go get -u github.com/mholt/caddy
cd $GOPATH/src/github.com/mholt/caddy/caddy
GOOS=linux go build .

Go Web Server

对于使用Go 来作web 服务来说,只需添加一个环境变量 GODEBUG=tls13=1,或者在程序代码里添加:

	goDebug := os.Getenv("GODEBUG")
	if goDebug == "" {
		goDebug = "tls13=1"
	} else {
		goDebug += ",tls13=1"
	}
	os.Setenv("GODEBUG", goDebug)

编译即可。

验证TLS 1.3

看看本站已启用

启用TLS1.3

Relative Articles
本文网址: https://www.golangnote.com/topic/254.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。