HSTS与SSL证书配置
前言
最近我部署在阿里云的个人网站,因为临时SSL证书过期,导致无法访问。之前刚买完服务器的时候部署配置过Nginx的SSL证书,但是时间过于久远,忘记怎么配置了,所以又重头搜了一下教程,这次归纳总结一下,下次就可以直接照做就好了。
正文
问题背景与故障现象
之前第一次部署网站的时候,随波逐流地在Nginx中设置了SSL证书和HTTPS访问:https://juejin.cn/spost/7604345576176877606
当时不求甚解,跟着教程将HSTS的过期时间配置的很大很大
grep -R "Strict-Transport-Security" /etc/nginx /etc/nginx/snippets/ssl-params.conf:add_header Strict-Transport-Security "max-age=31536000" always;
所以,当SSL证书过期之后,再使用https访问域名的时候就会出现下面的错误:
您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。
HSTS
HSTS是“HTTP Strict Transport Security”的缩写,是一种浏览器安全机制。当服务器通过响应头声明 HSTS 后,浏览器会在指定时间内强制只使用 HTTPS 访问该域名,并且:
- 不允许回退到 HTTP
- 即使证书过期、配置错误,也无法手动跳过
- 策略会被浏览器本地缓存
说人话就是如果浏览器接收到使用 HTTP 加载资源的请求,则必须尝试使用 HTTPS 请求替代。 如果 HTTPS 不可用,则必须直接终止连接。
对于大企业来说,HSTS能够很好的保障连接的安全,防止中间人攻击(仅使用HTTPS)。但是对于我的个人站来说,一旦SSL证书过期(90天/次),整个网站就无法访问。并且,即使我后期在服务端删除了HSTS的配置,之前访问过我个人网站的设备也无法绕过——我的max-age设置的太长了。
操作流程:修复好SSL证书之后,进入服务器更新配置文件
vim /etc/nginx/snippets/ssl-params.conf # 将max-age修改成0(不删除) add_header Strict-Transport-Security "max-age=0" always; nginx -t systemctl reload nginx
HTTP和HTTPS
HTTP是用于传输网页数据的应用层协议,但它是明文的,存在窃听、篡改、中间人攻击等安全风险。HTTPS则是HTTP的安全版本,通过SSL/TLS协议对传输数据进行加密和身份验证,确保数据在传输过程中的机密性、完整性和真实性。
SSL证书
我的云服务器是阿里云的,SSL证书也是在阿里云申请的免费测试证书,需要90天一续期。届时应前往官网阿里云-计算,为了无法计算的价值,进入数字证书管理服务进行重新申请
申请SSL证书分为3步:
- 购买证书
- 申请证书
- 部署证书
前两部都是在阿里云控制台进行购买和申请的,在此不做赘述,主要是第三步部署:下载适用于不同服务器类型的SSL证书-数字证书管理服务-阿里云
这里我选用的Web服务器是Nginx
在Nginx中部署SSL证书
当申请的证书通过CA验证的时候,就可以在阿里云控制台中进行下载。我这里下载的是适用于Nginx的PEM格式证书,解压后的文件有两个:
- 【domain name】.pem:证书文件。
- 【domain name】.key:证书私钥文件
解压后将其上传在服务器的某个地址(建议放在/etc/nginx/cert下面)
修改Nginx配置文件,我的配置文件位于:/etc/nginx/site-enabled/default中,在HTTPS的server块中增加上面证书配置文件的路径
# SSL证书配置 - 根据你的实际文件名修改 ssl_certificate /etc/nginx/cert/[domain name].pem; # 证书文件 ssl_certificate_key /etc/nginx/cert/[domain name].key; # 私钥文件
重载Nginx:
nginx -t systemctl reload nginx
结语
这次遇到的问题本质上并不复杂:SSL证书过期 + 过度配置的HSTS,共同导致了站点的不可访问。
真正的问题在于,当初在配置HTTPS时,对HSTS的理解停留在“安全最佳实践”,却忽略了它对运维稳定性和维护能力的隐含要求。在证书需要手动续期、站点由个人维护的前提下,过长的HSTSmax-age 实际上放大了单点失误的影响范围。
正浩创新EcoFlow公司福利 742人发布