创作者: 海市蜃楼233 合天智汇

随著网络安全愈来愈深入人心,愈来愈多的中文网站优先选择投入使用https来Teredo的身份验证,TLS1.2正式发布于2008年8月,迄今刚好有10年,因此新协定TLS1.3蓄势待发。Google chrome在前段时间的版预览中也已经开始逐渐对TLS1.3展开全力支持,TLS1.3对TLS1.2有关键性重写,提升了可靠性因此提升了速率,因此升级换代却是很有必要性的,责任编辑试著在nginx中迈入TLS1.3.

有关TLS1.3的科学普及能看上面的网页

https://wiki.openssl.org/index.php/TLS1.3

https://zhuanlan.zhihu.com/p/28850798

我这儿用的控制系统是Debian 8

第二步:加装倚赖

$ apt-get install git gcc make build-essential zlib1g-dev libpcre3-dev

第三步:浏览源代码和插件

$ mkdir -p /usr/src

$ cd /usr/src

$ git clone git://git.openssl.org/openssl.git openssl

$ git clone https://github.com/hakasenyang/openssl-patch.git openssl-patch

$ git clone https://github.com/kn007/patch.git nginx-patch

$ wget https://nginx.org/download/nginx-1.15.0.tar.gz

$ tar zxvf ./nginx-1.15.0.tar.gz

第三步:打插件

1,给OpenSSL打插件,插件的意义在于使OpenSSL全力支持最新的TLS1.3.

插件地址:https://github.com/hakasenyang/openssl-patch

$ cd /usr/src/openssl

$ patch -p1 < ../openssl-patch/openssl-equal-pre8_ciphers.patch

2,给Nginx打插件,nginx 插件添加SPDY全力支持,添加HTTP2 HPACK编码全力支持,添加动态TLS记录全力支持

插件地址:https://github.com/kn007/patch

fix_nginx_hpack_push_error 插件修复nginx的http2 push和http2 hpack兼容性问题

nginx_auto_using_PRIORITIZE_CHACHA 插件添加在使用OpenSSL1.1.1时SSL_OP_PRIORITIZE_CHACHA的全力支持。

$ cd /usr/src/nginx-1.15.0

$ patch -p1 < ../nginx-patch/nginx.patch

$ patch -p1 < ../nginx-patch/fix_nginx_hpack_push_error.patch

$ patch -p1 < ../nginx-patch/nginx_auto_using_PRIORITIZE_CHACHA.patch

第四步:编译加装

$ ./configure \

--sbin-path=/usr/sbin/nginx \

--conf-path=/etc/nginx/nginx.conf \

--prefix=/usr/local/nginx \

--pid-path=/var/run/nginx.pid \

--lock-path=/var/lock/nginx.lock \

--with-openssl=../openssl \

--with-http_v2_module \

--with-http_v2_hpack_enc \

--with-http_spdy_module \

--with-http_ssl_module \

--with-http_gzip_static_module \

--http-log-path=/var/log/nginx/access.log \

--error-log-path=/var/log/nginx/error.log

$ make

$ make install

Nginx的可执行文件加装在/usr/sbin/,Nginx配置文件在/etc/nginx/里

第五步:配置

1,修改Nginx全局配置:

将以下内容填入:/etc/nginx/nginx.conf

worker_processes auto;

pid /var/run/nginx.pid;

error_log /var/log/nginx/error.log;

events {

use epoll;

multi_accept on;

worker_connections 1024;

}

http {

charset utf-8;

include /etc/nginx/mime.types;

default_type application/octet-stream;

access_log /var/log/nginx/access.log;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 60;

gzip on;

gzip_vary on;

gzip_proxied any;

gzip_min_length 1k;

gzip_buffers 4 8k;

gzip_comp_level 2;

gzip_disable "msie6";

gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/svg+xml;

include /etc/nginx/vhost/*.conf;

}

2,修改Nginx站点配置

我们已经在全局配置里设置了包含/etc/nginx/vhost/目录下的conf文件

$ mkdir -p /etc/nginx/vhost

在然后/etc/nginx/vhost/里创建站点配置,这儿统一用域名文字代替真实域名

server {

listen 80;

server_name 域名;

root /wwwroot/域名;

location / {

index index.html;

}

}

这样HTTP的站点配置就弄好了,不过还站点还没网页,我们能先把Nginx的欢迎网页给放进去

mkdir -p /wwwroot/域名

$ cp/usr/local/nginx/html/index.html /wwwroot/域名/

$ nginx

启动Nginx后HTTP网页就正常了,打开就能看到欢迎网页。

第六步:签发证书

配置HTTPS首先要有证书,我这儿是使用acme.sh自动颁发让我们加密的证书

1,加装工具:

apt-get install cron socat

2,获取acme.sh:

curl https://get.acme.sh | sh

3,生成证书:

使用http方式验证域名,这是我们先搭建HTTP站点的原因,接下来指定域名,指定站点目录,已经开始签发

acme.sh --issue -d 域名 --webroot /wwwroot/域名/ --keylength ec-256 --nginx

4,复制证书:

证书已经签发,保存在~/.acme.sh/里

$ acme.sh --ecc --installcert -d 域名 \

--key-file /etc/nginx/ssl/域名.key \

--fullchain-file /etc/nginx/ssl/域名.cer \

--reloadcmd "nginx -s reload"

指定域名,指定证书保存目录,我这儿设置在/etc/nginx/ssl/,指定Nginx重载命令,如果签发的不是ECC证书,把--ecc参数去掉

这样使用acme.sh就完成了证书的签发,如果证书快要过期了,脚本会自动预览证书

脚本自动预览,能使用以下命令

$ acme.sh --upgrade --auto-upgrade

第七步:HTTPS站点配置

我给OpenSSL打的是pre8_ciphers插件,因此配置文件如下:

server {

listen 80;

server_name 域名;

return 301 https://域名$request_uri;

}

server {

listen 443 ssl http2;

server_name 域名;

root /wwwroot/域名;

ssl_certificate /etc/nginx/ssl/域名.cer;

ssl_certificate_key /etc/nginx/ssl/域名.key;

ssl_protocols TLSv1.2 TLSv1.3;

ssl_ciphers [TLS13+AESGCM+AES128|TLS13+AESGCM+AES256|TLS13+CHACHA20]:[EECDH+ECDSA+AESGCM+AES128|EECDH+ECDSA+CHACHA20]:EECDH+ECDSA+AESGCM+AES256:EECDH+ECDSA+AES128+SHA:EECDH+ECDSA+AES256+SHA:[EECDH+aRSA+AESGCM+AES128|EECDH+aRSA+CHACHA20]:EECDH+aRSA+AESGCM+AES256:EECDH+aRSA+AES128+SHA:EECDH+aRSA+AES256+SHA:RSA+AES128+SHA:RSA+AES256+SHA:RSA+3DES;

ssl_ecdh_curve X25519:P-256:P-384;

ssl_prefer_server_ciphers on;

ssl_session_cache shared:SSL:50m;

ssl_session_timeout 1d;

ssl_session_tickets on;

ssl_stapling on;

ssl_stapling_verify on;

add_header Strict-Transport-Security max-age=15768000;

location / {

index index.html;

http2_push /style.css;

}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {

expires 30d;

}

location ~ .*\.(js|css)?$ {

expires 15d;

}

location ~ /.git/ {

deny all;

}

}

以上就是完整的站点配置文件,覆盖/etc/nginx/vhost/域名.conf后,使用nginx -s reload重载Nginx再打开站点就能看到HTTPS的网页了

验证一下:

在Chrome 65或预览的版中,打开开发者工具的安全菜单,就能在里面看到站点是否以TLS1.3连接。

kn007的个人博客(BKN007)-第1张

后记:随著网络技术的发展,网络安全已经变得和我们的生活息息相关,我们需要新的技术来保护我们的隐私,而中文网站的站长更应该及时预览以保证用户数据的私密性,因此各位站长赶快升级换代吧。

郑重说明:利用责任编辑做任何违法事情,与本人和合天智汇无关,资料仅供参考与学习。