CentOS7 下 HTTPS 的配置与增强

By | 最新修改:2024-08-17

前言

什么是 HTTPS

HTTPS 全称“Hypertext Transfer Protocol Secure”(安全的超文本传输协议),也就是安全版的 HTTP 协议。

HTTPS 的深层

它存在于网络运输层 TCP(HTTP/3 是 UDP)协议之上,因而被称为加强版的 TCP。

重要的是,加强的 TCP 之上应用层 HTTP 之下是一种被叫做 SSL/TLS 的技术,SSL/TLS 核心主要技术是安全证书的交换,然而三者结合起来就是 HTTPS 协议。

HTTPS 的工作原理

它通过 SSL/TLS 技术提供的客户端和服务器端交换密钥和加解密方式让 HTTP 协议更加安全。

HTTPS 的历史、当前和未来

其实,SSL(安全套接字层)是最早应用于 HTTPS 的,并且其的 3.0 版本稍加修改就是现在已经发展到 v1.3 版本的 TLS(运输层安全性)。

而且这项应用层 Web 技术似乎已经成为一个现代网站的必备要素,然而现在 HTTPS 加密流量比例已经超过九成,毫不疑问它是 Web 发展的趋势之一。

本文的适用范围

该内容适用于以 Nginx 作为服务器软件的 RHEL 7 和 CentOS 7 操作系统,但是其他操作系统未做测试。

而后面章节关于给 HTTPS 增加安全系数的 OCSP、HSTS 和 HPKP 等内容所支持的操作系统平台是比较广泛的。


安装 Certbot for Nginx

免费的证书

虽然这些 HTTPS 优化技术虽然操作系统支持是广泛的,但是前提是使用了安全证书自动安装工具 CertBot。

然而,CertBot 是基于 Let’s Encrypt 提供的免费 SSL/TLS 证书。

注意的是,这种证书一次签发有效期是 90 天,到期要执行更新操作。

但是可以通过 Linux 的 Cron 计划任务功能自动续签。

安装 Certbot 工具

本文将借助 CertBot for Nginx 来安装 HTTPS 证书。

由于 CentOS 7 软件仓库中的的 Python3 版本过老,若以前者的 PIP 来安装 CertBot,可能会随机地出现意料之外的错误,因此要自行通过源代码编译较新版本的 Python3。

此方面的教程可参考:CentOS 7 编译安装 Python 3.12.0_CentOS7升级Python3

## yum -y install python3-pip
python3 -m pip install --upgrade pip
# 执行 certbot 的安装
python3 -m pip install certbot-nginx --upgrade

HTTPS 的安装过程

接下来开始给 Nginx 驱动的网站安装 HTTPS 证书:

给 Nginx 安装证书

前提条件

前提条件:

  1. Nginx 要有公网的 IP,并且其server_name 设置的是一个指向该 IP 的域名。
  2. 在此,服务器上 Nginx 是正常运行着的。

执行 HTTPS 证书的安装

certbot --nginx

证书安装过程

输入电子邮件地址
用于接收证书到期提醒:
同意协议
(Y)es/(N)o: Y
是否接收新闻和其他消息

一般输入“N”,表示不同意:

(Y)es/(N)o: N
域名的选择

选择对于哪些域名应用 HTTPS。

选择多个域名就用逗号分隔开域名前面的数字,全部启用则直接确定。

安装成功
Successfully received certificate.

基于 cerbot for nginx 的 https 的安装已经完成,然而接下来的工作是优化 https。

若访问的是 http,那么会自动转向 https。

nginx https 的基本用法和配置

检查配置是否合法

nginx -t

重启 Nginx 使配置生效

systemctl stop nginx.service
systemctl start nginx.service
# 查看启动状态
systemctl status -l nginx.service

启用 HTTP2

此时的 HTTPS 走的协议版本是 1.1,然后将以下部分这样修改,于是现在开始访问的 HTTP 协议就变成了 HTTP2:

## listen 443 ssl; # managed by Certbot
listen 443 ssl http2;

然而,在 Nginx v1.25.1+ 版本,上面的指令应改为:

listen 443 ssl;
http2 on;

修改完毕,要查检配置是否正确合法,只要确认没有问题后,要重启 Nginx 服务。

自动定期更新证书

值得注意的是,通过 certbot 安装的 https 证书的有效其仅为 90 天,因此在证书到期前要更新证书的到期日期。

echo "0 */2 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" >> /etc/crontab
crontab -uroot /etc/crontab
crontab -uroot -l

Nginx 如何优化 HTTPS

检查安全性

可以到 https://www.ssllabs.com/ssltest/analyze.html 这个网页来检查 HTTPS 的安全性。

从检测结果可以不难看出,至少该域名并没有设置 HSTS、HPKP 和 OCSP。

接下来将设置这三样东西。

设置 HSTS

HSTS,(HTTP Strict Transport Security),即“HTTP 严格传输安全”,使用它来减少会话劫持风险。

直接在 server 块中添加上以下一行:

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

设置 HPKP

HPKP,HTTP Public Key Pinning(HTTP 公钥固定),它的作用是告诉浏览器特定加密公钥与特定服务器相关联,防范“请求伪造”攻击。

先设置一个 Bash Shell 变量,这个变量的值可以改变任意的域名。

当然,前提是你打算在此服务器上给 Nginx 使用的域名。

# 该变量仅在当前会话有效
SERVER_NAME=test2023.example.com
  1. 生成第一个指纹
    openssl x509 -pubkey < /etc/letsencrypt/archive/${SERVER_NAME}/cert1.pem | \
    # 生成指纹
    openssl pkey -pubin -outform der | \
    openssl dgst -sha256 -binary | base64
    

    第一个指纹: jb36azlkvnunr93ReBsPpH3F9D8MczxTtToIMkgl6IY=

  2. 生成第二个指纹

    mkdir -p /etc/ssl/certs/${SERVER_NAME}
    cp /etc/letsencrypt/archive/${SERVER_NAME}/privkey1.pem   /etc/ssl/certs/${SERVER_NAME}/${SERVER_NAME}.first.key
    cp /etc/letsencrypt/csr/0000_csr-certbot.pem   /etc/ssl/certs/${SERVER_NAME}/${SERVER_NAME}.first.csr
    
    cd /etc/ssl/certs/${SERVER_NAME}
    openssl genrsa -out ${SERVER_NAME}.second.key 4096
    openssl req -new -key ${SERVER_NAME}.second.key -sha256 -out ${SERVER_NAME}.second.csr
    # 生成指纹
    openssl req -pubkey < ${SERVER_NAME}.second.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
    

    第二个指纹: li22TfqdKhrNoGVZp4y/+HjYAEzOXTy19BbZMuzJcQI=

  3. 生成第三个指纹

    openssl genrsa -out ${SERVER_NAME}.third.key 4096
    openssl req -new -key ${SERVER_NAME}.third.key -sha256 -out ${SERVER_NAME}.third.csr
    # 生成指纹
    openssl req -pubkey < ${SERVER_NAME}.third.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
    

    第三个指纹: vIa9bmFDgnQoPfMmi4/1okvnUcRAym7HNdFTOjkBIfY=

HPKP 的配置如下:

add_header Public-Key-Pins 'pin-sha256="jb36azlkvnunr93ReBsPpH3F9D8MczxTtToIMkgl6IY="; pin-sha256="li22TfqdKhrNoGVZp4y/+HjYAEzOXTy19BbZMuzJcQI="; pin-sha256="vIa9bmFDgnQoPfMmi4/1okvnUcRAym7HNdFTOjkBIfY="; max-age=2592000; includeSubDomains';

将其放置于 Nginx 配置文件的 server 块中。

OCSP 的配置

OCSP(Online Certificate Status Protocol,在线证书状态协议),通过一定的机制和手段用于检查 HTTPS 证书是否过期的技术。

当 Nginx 通过 CloudFlare/quiche 或者 Nginx-quic 支持 HTTP/3 时,该配置无效。

  1. 生成证书链文件
    cd /etc/letsencrypt/live/${SERVER_NAME}/
    cat fullchain.pem  privkey.pem > ${SERVER_NAME}.chain.stapling.pem
    mv ${SERVER_NAME}.chain.stapling.pem  /etc/ssl/certs/
    
  2. 配置到 Nginx
    # ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    ssl_trusted_certificate /etc/ssl/certs/test2023.example.com.chain.stapling.pem;
    

设置完成要重启 Nginx 服务。


后话

在这个互联网安全风险泛滥的时代,作为因特网基石般地位的应用层协议 HTTP 理应与时俱进。淘汰掉旧技术,追赶、应用新的技术已然成为了趋势。站在 SSL/TLS 技术之上的 HTTPS 应运而生,风靡整个时代,可知 HTTPS 对于因特网而言是有多重要。因此,我们要让 HTTPS 成为建设网站必须要配置的工具。

如果在配置过程中有疑问,请先百度,若是得不到解决,可以联系作者:admin@icxzl.com,我们共同探讨一下。

欢迎访问本人的博客和关注微信公众号!


程序知路

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。

本文章可以转载,但是需要说明来源出处!

本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com