TLS1.2 发布于 2008 年 8 月,至今正好有 10 年,随着互联网安全越来越受到重视,新协议 TLS1.3 呼之欲出。值得一提的是,从第一份草案编写至今,已经有几年时间了,截止这篇文章编写,已经是第 28 份草案。在最近的 Chrome 版本更新中也逐步对 TLS1.3 进行支持,Chrome 65 开始默认开启 draft 23、Chrome 68 开始支持 draft 28

更新:TLS 1.3 标准已于 2018 年 8 月正式发布为 RFC 8446 ,距 TLS1.2 发布正好 10 周年

TLS1.3 对于 TLS1.2 有重大改写,既提高了安全性又提高了速度,以至于有争议称,应该把它叫做 TLS2.0

关于 TLS1.3 的科普可以看下面的页面

https://wiki.openssl.org/index.php/TLS1.3
https://zhuanlan.zhihu.com/p/28850798

之前我也写过 Nginx 的 https 的配置 https://zhih.me/nginx-http2-https/ ,当时是使用 TLS1.2 的

碰巧前几天发现 .ooo 可以免费用 1 年,就撸了一个 onmp.ooo 来做为我 onmp 项目的页面,把它搭在 4 刀年付的 virmach 上,顺便测试 TLS1.3

一键安装

最近更新支持防火墙功能,详情可以看 https://zhih.me/ngx-lua-waf/

sh -c "$(curl -kfsSl https://raw.githubusercontent.com/xzhih/nginx-compile/master/install.sh)"

安装

我这里用的系统是 Debian 8

安装依赖

apt-get install git gcc make build-essential -y

下载源码

我们把源码全都放在一个地方,方便使用,创建 nginx 的运行用户 www-data

rm -rf /usr/src/
mkdir -p /usr/src/
mkdir -p /var/log/nginx/
useradd -s /sbin/nologin -M www-data

克隆 OpenSSL

这里用的是 1.1.1 稳定版的源码

cd /usr/src
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1.tar.gz
tar xzvf OpenSSL_1_1_1.tar.gz
mv openssl-OpenSSL_1_1_1 openssl

下载 Nginx 的源码

cd /usr/src/
wget https://nginx.org/download/nginx-1.15.6.tar.gz
tar zxf ./nginx-1.15.6.tar.gz
mv nginx-1.15.6 nginx

克隆 zlib

开启 gzip 要用到 zlib 库,这里使用的是 Cloudflare 优化的版本,比原版具有更高的压缩性能

cd /usr/src/
git clone https://github.com/cloudflare/zlib.git zlib
cd zlib
make -f Makefile.in distclean

克隆 Brotli

就像 gzip 一样,Brotli 也是一种压缩算法,它是由谷歌开发的一个更适合文本压缩的算法,因为它使用了字典,所以有更好的压缩比。

现在主流浏览器都已经支持 Brotli 了,而且也能与 gzip 共存,如果浏览器支持 Brotli 就会优先使用,所以可以放心兼容性,可以在这里看到支持的数据 https://caniuse.com/#search=Brotli

cd /usr/src/
git clone --recursive https://github.com/google/ngx_brotli.git

我给 nginx 默认配置的 Brotli 压缩等级为 6 级,这对于动态内容比较友好,如果你是像我现在这个博客一样是静态化的,那么建议开启 11 级压缩,这样可以获得最好的体验

下载 PCRE

nginx rewrite 模块需要 pcre 库

cd /usr/src/
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz
tar zxf ./pcre-8.42.tar.gz

给 OpenSSL 打补丁

补丁来自:https://github.com/hakasenyang/openssl-patch

此补丁的目的是让 OpenSSL 支持 TLS1.3 的 23,26,28 草案,以及 Final 版标准

cd /usr/src/
git clone https://github.com/hakasenyang/openssl-patch.git
cd /usr/src/openssl
patch -p1 < ../openssl-patch/openssl-equal-1.1.1_ciphers.patch
patch -p1 < ../openssl-patch/openssl-1.1.1-chacha_draft.patch

给 Nginx 打补丁

补丁来自:https://github.com/kn007/patch

nginx 补丁

  • 添加SPDY支持。
  • 添加HTTP2 HPACK编码支持。
  • 添加动态TLS记录支持。

nginx_auto_using_PRIORITIZE_CHACHA 补丁

  • 支持时使用 SSL_OP_PRIORITIZE_CHACHA
cd /usr/src/
git clone https://github.com/kn007/patch.git nginx-patch
cd /usr/src/nginx
patch -p1 < ../nginx-patch/nginx.patch
patch -p1 < ../nginx-patch/nginx_auto_using_PRIORITIZE_CHACHA.patch

使用 jemalloc 作为内存管理

cd /usr/src/
wget https://github.com/jemalloc/jemalloc/releases/download/5.1.0/jemalloc-5.1.0.tar.bz2
tar xjvf jemalloc-5.1.0.tar.bz2
cd jemalloc-5.1.0
./configure
make && make install
echo '/usr/local/lib' >> /etc/ld.so.conf.d/local.conf
ldconfig

其他编译配置

Nginx 默认会以 debug 模式编译,我们需要注释掉 /usr/src/nginx/auto/cc/gcc 中 CFLAGS="$CFLAGS -g" 这行,这样可以减少生成文件的大小

sed -i 's@CFLAGS="$CFLAGS -g"@#CFLAGS="$CFLAGS -g"@' /usr/src/nginx/auto/cc/gcc

编译安装

cd /usr/src/nginx
./configure \
--user=www-data --group=www-data \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--with-compat --with-file-aio --with-threads \
--with-http_v2_module --with-http_v2_hpack_enc \
--with-http_spdy_module --with-http_realip_module \
--with-http_flv_module --with-http_mp4_module \
--with-openssl=../openssl --with-http_ssl_module \
--with-pcre=../pcre-8.42 --with-pcre-jit \
--with-zlib=../zlib --with-http_gzip_static_module \
--add-module=../ngx_brotli \
--with-ld-opt=-ljemallocmake
make install

Nginx 的可执行文件安装在 /usr/sbin/nginx ,Nginx 配置在 /usr/local/nginx/conf/ 里

配置

Nginx 已经安装上了,现在我们来配置网站,让它跑起来

Nginx 全局配置

把以下内容覆盖填入 /usr/local/nginx/conf/nginx.conf

user www-data;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 65535;events {use epoll;multi_accept on;worker_connections 65535;
}http {charset utf-8;sendfile on;aio threads;directio 512k;tcp_nopush on;tcp_nodelay on;server_tokens off;log_not_found off;types_hash_max_size 2048;client_max_body_size 16M;# MIMEinclude mime.types;default_type application/octet-stream;# Loggingaccess_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log warn;# Gzipgzip on;gzip_vary on;gzip_proxied any;gzip_comp_level 6;gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;gzip_disable "MSIE [1-6]\.(?!.*SV1)";# Brotlibrotli on;brotli_comp_level 6;brotli_static on;brotli_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;include vhost/*.conf;
}

Nginx 站点配置

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

mkdir -p /usr/local/nginx/conf/vhost/

然后在 /usr/local/nginx/conf/vhost/ 里创建站点配置,比如我的是 onmp.ooo.conf

server {listen 80;server_name onmp.ooo;root /wwwroot/onmp.ooo;location / {index  index.html;}
}

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

mkdir -p /wwwroot
cp -r /usr/local/nginx/html /wwwroot/onmp.ooo# 配置站点目录权限
chown -R www-data:www-data /wwwroot/
find /wwwroot/ -type d -exec chmod 755 {} \;
find /wwwroot/ -type f -exec chmod 644 {} \;

service 配置

service 命令用于对系统服务进行管理,比如启动(start)、停止(stop)、重启(restart)、查看状态(status)等,我们是编译安装的,所以要手动创建服务文件。

mkdir -p /usr/lib/systemd/system/

编辑 /usr/lib/systemd/system/nginx.service 写入以下内容

[Unit]
Description=nginx - high performance web server
After=network.target[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPost=/bin/sleep 0.1
ExecStartPre=/usr/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop[Install]
WantedBy=multi-user.target

启动服务

systemctl daemon-reload #重载
systemctl enable nginx #开机启动
systemctl start nginx #运行

我们现在可以用 service 或 systemctl 管理 nginx 了

启动 Nginx 后 HTTP 页面就正常了,打开 onmp.ooo 就能看到 Welcome to nginx!

签发证书

配置 HTTPS 首先要有证书,我这里是使用 acme.sh 自动颁发 Let’s Encrypt 的证书

具体使用教程看我的另一篇教程 使用acme.sh获取免费SSL证书

当然,你要是已经有了 SSL 证书,直接看下面配置文件里证书存放的目录,直接放到里面去就行,其他操作一样的

HTTPS 站点配置

因为我给 OpenSSL 打的是 equal-1.1.1_ciphers 补丁,所以 ssl_ciphers 配置文件如下,如果你打的是别的补丁,则需要查看 https://github.com/hakasenyang/openssl-patch 给的配置

server {listen 80;server_name onmp.ooo;return 301 https://onmp.ooo$request_uri;
}server {listen 443 ssl http2;server_name onmp.ooo;root /wwwroot/onmp.ooo;# SSLssl_certificate         /usr/local/nginx/conf/ssl/onmp.ooo.cer;ssl_certificate_key     /usr/local/nginx/conf/ssl/onmp.ooo.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;# OCSP Staplingssl_stapling on;ssl_stapling_verify on;resolver 119.29.29.29 8.8.8.8 valid=300s;resolver_timeout 10s;# Security headersadd_header X-Frame-Options "SAMEORIGIN" always;add_header X-XSS-Protection "1; mode=block" always;add_header X-Content-Type-Options "nosniff" always;add_header Referrer-Policy "no-referrer-when-downgrade" always;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;location / {index  index.html;http2_push /style.css;}location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ {expires 30d;}location ~ .*\.(js|css)?$ {expires 15d;}
}

以上就是完整的站点配置文件,覆盖 /usr/local/nginx/conf/vhost/onmp.ooo.conf 后,使用 service nginx reload 重载 Nginx 再打开站点就能看到 HTTPS 的页面了

验证

在 Chrome 65 或更新的版本中,打开开发者工具的 Security 菜单,就能在里面看到 站点是否以 TLS1.3 连接

或者可以到 SSL Server Test:https://www.ssllabs.com/ssltest/index.html 进行测试

我只开启了 TLSv1.2 TLSv1.3 的支持,如果需要,你可以自己增加其他协议的支持

结语

人们的生活已经离不开网络,所以网络安全在现在和未来都至关重要,曾经很多站长都以 HTTPS 影响站点速度为由,又或者说 SSL 证书昂贵,拒绝配 HTTPS,而随着技术的迭代升级,配置 HTTPS+HTTPS2 能提高网站速度,而 SSL 不仅可以免费获取,还可以使用命令自动获取自动更新,在我看来已经没有理由不配置 HTTPS 了,所以希望各位站长,都赶紧上车吧

编译Nginx支持TLS1.3相关推荐

  1. Linux系统下Nginx支持ipv6

    一.查看现有nginx是否支持ipv6 需要执行以下命令,查看现有nginx是否支持ipv6,如果参数中具有--with-ipv6,则支持,如 果没有,则不支持,需要重新编译nginx. # 此处的n ...

  2. 源码编译更新nginx到最新版本,并开始nginx支持http2协议模块.

    最近因为迁移公司vm上的代码,遇到一些问题.有一台vm配置了https协议,原以为迁移安全证书以后,配置nginx就可以了,但是修改nginx配置文件以后,执行 nginx -t 命令后,报如下错误: ...

  3. 编译nginx时的两个报错

    为内部一台测试机./configure编译nginx时遇到报错,记录下来 ./configure \ --prefix=/usr/local/nginx \ 指定安装位置 --with-http_fl ...

  4. nginx 支持php-fpm,nginx php-fpm安装配置以支持PHP

    nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端. nginx一般是把请求发fastcgi管理进程处理,fascgi管 ...

  5. 记一次失败的Windows环境编译Nginx源码

    最近想学习下nginx的源码,之前在linux环境编译安装过多次,在windows环境还是第一次尝试,遇到了不少问题,记录一下.可惜的是编译成功后,在最后运行的时候还是会报错,如果有人遇到类似的问题希 ...

  6. nginx lua以html显示,nginx 支持lua及lua脚本格式化日志

    1.安装LuaJIT-2.0.4 链接: http://luajit.org/download.html tar -xf LuaJIT-2.0.4.tar.gz cd LuaJIT-2.0.4 mak ...

  7. centos7.4下安装配置PHP服务(源码安装)并配置nginx支持php

    一.检查php是否已经安装,使用php -v,是否能够看到版本号,或者使用rpm -qa | grep php查看是否安装过. # yum remove php* -y 二.依赖包安装 Linux软件 ...

  8. 让nginx支持文件上传的几种模式

    2019独角兽企业重金招聘Python工程师标准>>> 文件上传的几种不同语言和不同方法的总结. 第一种模式 : PHP 语言来处理 这个模式比较简单, 用的人也是最多的, 类似的还 ...

  9. 让你的nginx支持分布式追踪opentracing

    Background NGINX 是一个通用且流行的应用程序.也是最流行的 Web 服务器,它可用于提供静态文件内容,但也通常与其他服务一起用作分布式系统中的组件,在其中它用作反向代理.负载均衡 或 ...

  10. centos7.4配置nginx php,centos7.4下安装配置PHP服务(源码安装)并配置nginx支持php

    一.检查php是否已经安装,使用php -v,是否能够看到版本号,或者使用rpm -qa | grep php查看是否安装过. # yum remove php* -y 二.依赖包安装 Linux软件 ...

最新文章

  1. JSP 异常处理如何处理?
  2. Name node is in safe mode解决
  3. mysql+phpmyadmin配置流程
  4. [HTB]“Heist”靶机渗透详细思路
  5. 高中教师计算机技能大赛,计算机科学与技术学院第九届教师技能大赛初赛圆满举行...
  6. ROS笔记(19) 摄像头仿真
  7. vs2017安装和使用教程(详细)
  8. 油猴脚本(实习生趁手的工具)
  9. python可以下载百度文库的文档_Python 文档
  10. Android 7.0 抓包
  11. .Net framework 3.5缺失解决
  12. 什么是html阅读,HTML 介绍
  13. VB中关于Array函数与Split函数
  14. ceph peering机制-状态机
  15. 【超实用】各种单位换算表大全
  16. CSS入门五:文本样式;字体颜色:英文字母,十六进制,RGB;文本颜色,字间距,行间距,对齐方式;下划线、上划线…,文本阴影,字母大小写,首行缩进
  17. 天天学JAVA-JAVA基础(3)
  18. 【笔记】DeepIGeoS: A Deep Interactive Geodesic Framework for Medical Image Segmentation
  19. java语音播报天气_语音播报实时天气
  20. ssm基于Java的微小企业人事管理系统的设计与实现毕业设计源码231012

热门文章

  1. sql order by按俩个字段排序
  2. 联想拯救者y700 2023参数 评测
  3. ​朋友圈评论截图生成,制作朋友圈网页​
  4. FOXBORO P0916AA 控制模块
  5. 林业调查资质线上申报教学
  6. 几种常见的网站安全问题
  7. 浅析深度学习在图像处理中的应用趋势及常见技巧
  8. 【考试系统笔试操作文档】
  9. python的类名一定要大写吗_python类名_python 类名_python类名大写 - 云+社区 - 腾讯云...
  10. SOA=SOME/IP?你低估了这件事