本文主要介绍如何使用编译的方式升级openssl库和nginx用于支持HTTP2和TLSv1.3并且介绍了一些简单的提高nginx安全性的配置。

1、编译安装openssl

考虑到Linux系统中有许多组件都需要使用openssl库,而现在默认使用的openssl库绝大多数都没到达能够支持TLS1.3的openssl1.1.1版本以上,因此个人建议不要直接修改系统已有的默认openssl库而是另外使用一个新目录来编译安装新版本的openssl。

具体的支持信息可以查看openssl官网的TLSv1.3部分。

解压下载的稳定版openssl1.1.1g进行编译安装,注意使用--prefix=指定安装目录

# 下载
wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz
# 解压
tar -zxvf openssl-1.1.1g.tar.gz
# 配置、编译
./config  --prefix=/home/openssl
make
# 检查是否出错
make test
# 安装
make install

安装完成后检查链接库是否正常,将缺少的文件直接软链接到系统的/usr/lib64目录下

ln -s /home/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /home/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

最后检查系统使用的openssl的版本是否为新版以及系统的库指向是否正确

2、编译安装nginx

2.1 nginx的TLS1.3和HTTP2

想要在nginx中开启TLS1.3的支持,只需要使用支持TLS1.3的openssl库来进行编译即可。

查看nginx的版本更新说明我们可以知道nginx从1.9.5版本开始支持HTTP2:

从1.13版本开始支持TLS1.3

2.2 指定openssl目录进行nginx编译安装

nginx的编译安装此前已经介绍过了,有需要的同学可以点击这里回顾。

wget http://nginx.org/download/nginx-1.18.0.tar.gz

这次我们使用的是截止2020年5月19号最新的稳定版本nginx1.18.0,一些注意的事项如下:

  • --with-http_v2_module--with-http_ssl_module用于支持HTTP2和ssl加密,
  • --with-openssl=用于指定openssl库的安装目录
  • --with-openssl-opt=enable-tls1_3用于开启openssl库的tls1.3支持,但是现在的新版本已经默认开启,无需额外添加这个参数

剩下的就和常规的编译安装无异,下面是此次编译的参数:

./configure --prefix=/home/nginx \
--sbin-path=/home/nginx/sbin/nginx \
--with-openssl-opt=enable-tls1_3 \
--with-openssl=/home/openssl \
--conf-path=/home/nginx/nginx.conf \
--error-log-path=/home/nginx/logs/error.log \
--http-log-path=/home/nginx/logs/access.log \
--pid-path=/home/nginx/nginx.pid \
--lock-path=/home/nginx/nginx.lock \
--http-client-body-temp-path=/home/nginx/cache/client_temp \
--http-proxy-temp-path=/home/nginx/cache/proxy_temp \
--http-fastcgi-temp-path=/home/nginx/cache/fastcgi_temp \
--http-uwsgi-temp-path=/home/nginx/cache/uwsgi_temp \
--http-scgi-temp-path=/home/nginx/cache/scgi_temp \
--user=nginx \
--group=nginx \
--with-compat \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-stream

编译的时候出现报错:

修改nginx源码目录中auto/lib/openssl/conf中的openssl路径参数,在40行左右的位置对应四个参数中的.openssl去掉,修改后的内容如下:

 39             CORE_INCS="$CORE_INCS $OPENSSL/include"40             CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"41             CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"42             CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"

然后重新编译安装。

2.3 nginx配置修改

安装完成之后将原来的配置文件和html文件全部迁移到新的nginx目录下并进行相应的修改就可以正常的启用nginx了。如果此前的nginx是直接使用yum安装并且使用systemd进行守护进程的控制,我们可以将对应的systemd unit文件中的目录进行修改,一般来说只需要修改相关路径的参数即可:

首先我们停止服务,然后修改文件,接着重启服务即可:

# 停止nginx
systemctl stop nginx
# 修改配置文件
vim /usr/lib/systemd/system/nginx.service[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target[Service]
Type=forking
PIDFile=/home/nginx/nginx.pid
ExecStart=/home/nginx/sbin/nginx -c /home/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID[Install]
WantedBy=multi-user.target# 重启daemon进程
systemctl daemon-reload

如果还想使用全局命令nginx的话,可以先把原来的yum安装的移除再将编译安装的新版本指向系统目录

#使用which nginx查看nginx的指向
[root@aliyun bin]# which nginx
/usr/sbin/nginx
[root@aliyun bin]# mv /usr/sbin/nginx /usr/sbin/nginx.bak
[root@aliyun bin]# ln -s /home/nginx/sbin/nginx /usr/sbin/nginx

最后我们查看nginx版本信息:

3、配置http2和tls1.3

3.1 nginx配置

nginx中开启http2和tls1.3十分简单,这里配置如下:

server{listen 80;server_name tinychen.com www.tinychen.com;if ($server_port = 80){return 301 https://$host$request_uri;}
}server{listen 443 ssl http2 default_server;server_name tinychen.com www.tinychen.com;add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES;#ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256;ssl_protocols TLSv1.2 TLSv1.3;ssl_stapling on;ssl_stapling_verify on;ssl_trusted_certificate certs/tinychen.com.pem;ssl_prefer_server_ciphers on;ssl_certificate certs/tinychen.com.pem;ssl_certificate_key certs/tinychen.com.key;ssl_session_cache shared:SSL:1m;ssl_verify_depth 10;ssl_session_timeout 30m;location / {root html/;index index.html index.htm;}}
  • 由于http2默认需要使用加密,因此直接在nginx对应的ssl监听端口上加上http2字段即可
  • TLS1.3则只需要在ssl_protocols指令中加上TLSv1.3
  • ssl_ciphers这里的配置采用了比较激进的配置,由于前面协议只启用了TLSv1.2和TLSv1.3,因此这里对应的ssl_ciphers也直接弃用了大量旧的和弱的加密套件
  • add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";这个字段头用于开启HSTS避免在进行301跳转的时候被中间人攻击,添加了preload字段还需要在HSTS的官网添加自己的网址,注意HSTS不应该添加在HTTP请求的网站上,所以上面将80端口和443端口分为两个server块
  • ssl_stapling on用于开启OCSP(Online Certificate Status Protocol),可以减缓网络和客户端资源负担
  • ssl_stapling_verify on用于开启OCSP Stapling(OCSP装订),这是TLS证书状态查询扩展,服务器在TLS握手时发送事先缓存的OCSP响应,用户只要验证该响应的时效性而不用再向数字证书认证机构(CA)发送请求,可以加快握手速度

3.2 检测

使用myssl进行检测,可以看到很顺利地显示已经支持了HTTP2和TLS1.3协议。

同时可以看到由于关闭了TLS1.2以下的加密协议支持并且强制启用了https之后很多旧浏览器已经不再支持了:

在不考虑旧版浏览器的兼容之后可以很轻松获得A+评分并且上榜:

同样的我们可以使用ssllab来进行测试,测试结果也是大同小异:

3.3 主流网站测试

下表是截止2020年6月6日使用Chrome(83.0.4103.97(正式版本))对一些主要的网站首页进行的简单测试

简称 网站 HTTP TLS
谷歌 google.com/ H2+quic/46 TLS1.3
苹果 apple.com.cn/ H2 TLS1.3
GitHub github.com/ H2 TLS1.3
维基百科 en.wikipedia.org/ H2 TLS1.3
k8s kubernetes.io/ H2 TLS1.3
nginx商业版 nginx.com/ H2 TLS1.3
阿里CDN *.alicdn.com H2 TLS1.3
163首页 163.com/ H2+HTTP1.1 TLS1.3
ssllab ssllabs.com/index.html HTTP1.1 TLS1.3
微软 microsoft.com/zh-cn/ H2 TLS1.2
docker docker.com/ H2 TLS1.2
微信 weixin.qq.com/ H2 TLS1.2
严选 you.163.com/ H2 TLS1.2
淘宝 taobao.com/ H2 TLS1.2
天猫 tmall.com/ H2 TLS1.2
阿里巴巴 alibaba.com/ H2 TLS1.2
csdn csdn.net/ H2 TLS1.2
腾讯云 cloud.tencent.com/ H2 TLS1.2
亚马逊 amazon.com/ H2+HTTP1.1 TLS1.2
QQ qq.com/ H2+HTTP1.1 TLS1.2
B站 bilibili.com/ H2+HTTP1.1 TLS1.2
百度 baidu.com/ H2+HTTP1.1 TLS1.2
今日头条 toutiao.com/ H2+HTTP1.1 TLS1.2
小米 mi.com/ H2+HTTP1.1 TLS1.2
拼多多 pinduoduo.com/ H2+HTTP1.1 TLS1.2
美团 meituan.com/ HTTP1.1+H2(极少) TLS1.2
网易企业邮 qiye.163.com/ HTTP1.1 TLS1.2
126邮箱 126.com/ HTTP1.1 TLS1.2
myssl myssl.com/ HTTP1.1 TLS1.2
openssl openssl.org/ HTTP1.1 TLS1.2
nginx开源版 nginx.org/ HTTP1.1 TLS1.2
华为 huawei.com/cn/ HTTP1.1 TLS1.2

nginx篇07-启用HTTP2和TLSv1.3相关推荐

  1. nginx配置域名启用http2协议

    HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议.HTTP/2在支持HTTP1.1的基础上拓展了, 较之1.1在性能上有着大 ...

  2. 关于nginx启用HTTP2后出现ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY错误的解决方案

    问题 为了提高网站访问速度,在nginx中启用http2协议,配置完成后通过浏览器访问站点无法显示页面,提示"ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY& ...

  3. 两年来的core折腾之路几点总结,附上nginx启用http2拿来即用的配置

    为什么要迁移,江湖上传说windows server的稳定性不如某某某,这类议题与八卦新闻没两样,不谈,如果windows的价钱能够和linux相同或者差异不至于那么大,我才懒得换,因为穷,这才是重点 ...

  4. java 集成grizzly_使用Grizzly的嵌入式Java服务器:如何启用http2

    所以我试图使用Grizzly / Jersey创建一个REST API服务器,它工作正常,但我无法弄清楚如何启用http2.关于这个问题的文件几乎都不存在.这是我拥有的: private static ...

  5. OD使用教程7(上)- 调试篇07|解密系列

    OD使用教程7(上)- 调试篇07 让编程改变世界 Change the world by program   小甲鱼觉得,掌握逆向的思维尤为重要. 所以在咱的OD使用教程中,不单会告诉你怎么去逆向这 ...

  6. Spring Boot 启用 http2 协议

    Spring Boot 启用 http2 协议 HTTP2是万维网(WWW)发布的HTTP网络协议主流版本,也是当前HTTP协议的最新版本(1997年发布的HTTP 1.1).它来源于SPDY协议,最 ...

  7. 在SpringBoot中启用Http2.0

    HTTP2.0特性 虽然没有官方明确必须使用https,但是浏览器默认使用https才能使用http2.0发起请求. 虽然HTTP/2没有明确要求必须使用TLS,但当前几乎所有浏览器均只支持 HTTP ...

  8. 在Spring Boot中启用Http2.0

    HTTP2.0特性 通俗易懂篇:https://www.cnblogs.com/yingsmirk/p/5248506.html 深入了解篇:https://www.jianshu.com/p/67c ...

  9. nginx篇08-添加客户端证书认证

    本文主要介绍如何使用给nginx服务添加客户端证书认证从而实现双向加密. 对于一般的https网站来说,实际上https所使用的证书是属于单向验证,即客户端单向验证服务器的安全性,而服务器端是没有对客 ...

最新文章

  1. iOS: 零误差或极小误差的定时执行或延迟执行?
  2. RSA的密钥把JAVA格式转换成C#的格式
  3. 64位x86-64处理器架构
  4. Linux SSH命令使用大全
  5. 一份帮助你更好地理解深度学习的资源清单 1
  6. 大型网站架构演变和知识体系(转)
  7. 2019-5-5学习心得
  8. 安卓能硬改的手机机型_这款iPhone手机专属特效AR相机,我真的爱了
  9. 解析AI漫画系统CariGAN:这效果让漫画师颤抖!
  10. C#防SQL注入之SqlParameter参数化
  11. 软件安全备考--PE文件
  12. RAKsmart高防服务器怎么样
  13. R语言实验报告【全集】
  14. day04-判断和循环
  15. Python爬虫之GUI图表
  16. Power BI 参数解决源文件路径问题
  17. 使用Java实现简单的监控系统
  18. Photozoom pro 7中文版下载
  19. Defold 游戏引擎
  20. html页面下雪动画实例,HTML5实现下雪实例

热门文章

  1. Android设置EditText键盘输入字母和数字
  2. 身份证、护照验证 身份证号码获取生日、性别信息
  3. GetBean GetModel
  4. MySQL 导入数据的几种方法
  5. velocity配置
  6. 链表和数组的优缺点对比
  7. 醒了自悟系列--蝶恋花-项目小结
  8. C语言Window控制台实现弹弹方块(单个方块,多个方块)
  9. 想通过微信公众号来增长技术,很难
  10. 瑞士轮赛制模拟器_【科普】瑞士轮比赛赛制(简称瑞士制)