HTTPS 配置 HPKP

By | July 10, 2017

最后更新时间: 2020-06-13 11:09:49

HTTPS 配置 HPKP

Updated On: 2020-06-13

Create On: 2017/07/09

本文很大程度上是参考其他英文资料(见文末的“参考资料”)总结的简要步骤翻译而成,如有侵权,请联系本人(联系方式本站中有)。

本文是关于增强HTTPS安全性的配置,所用服务器软件是Nginx,HTTPS证书由Certbot自动生成,因为本文内容的应用范围也只适用于Certbot生成的HTTPS配置,或许也可作为对以其他方式配置的HTTPS在HPKP方面进行安全优化的参考。

HPKP,英文HTTP Public Key Pinning,中文译为“HTTP公钥固定扩展”,是HTTPS网站防止攻击者使用CA错误签发的证书进行中间人攻击的一种安全机制,用于预防诸如攻击者入侵CA偷发证书、浏览器信任的CA签发伪造证书等情况。采用该机制后,网站服务器会提供一个公钥哈希列表,客户端在后续通讯中将只接受该列表上的一个或多个公钥。(据 维基百科

生成第一个指纹:

openssl x509 -pubkey < /etc/letsencrypt/archive/yourdomain.com/cert1.pem | \
openssl pkey -pubin -outform der | \
openssl dgst -sha256 -binary | base64
1XH16wMcwsBfOsMEb/ufcsR0lAtbK024XEWial43Kxc=

执行以下命令:

mkdir -p /etc/ssl/certs/yourdomain.com
cp /etc/letsencrypt/archive/yourdomain.com/privkey1.pem /etc/ssl/certs/yourdomain.com/yourdomain_com.first.key
cp /etc/letsencrypt/csr/0000_csr-certbot.pem /etc/ssl/certs/yourdomain.com/yourdomain_com.first.csr

生成备份key、csr和各自的指纹:

cd /etc/ssl/certs/yourdomain.com
openssl genrsa -out yourdomain_com.second.key 4096
openssl req -new -key yourdomain_com.second.key -sha256 -out yourdomain_com.second.csr
openssl req -pubkey < yourdomain_com.second.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
openssl genrsa -out yourdomain_com.third.key 4096
openssl req -new -key yourdomain_com.third.key -sha256 -out yourdomain_com.third.csr
openssl req -pubkey < yourdomain_com.third.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64

以上生成的三个指纹都类似。

添加HPKP头到Nginx配置中:

vi /etc/nginx/nginx.conf

在server块中添加:

add_header Public-Key-Pins 'pin-sha256="D5tCDvTlOey906WIwLSuJMpopHw5OuhXnYS/4Qyzlwk="; pin-sha256="V+3yq8vnC7oK/8f5FurGZi1fFm50nu92E6GBuSOUl6M="; pin-sha256="sFh1BtMheODncG38cu35FcVMv/eeO5nky69i8ZGyzY4=";max-age=2592000; includeSubDomains';

注意:如果网站使用的CDN(内容分发网络)的主机是网站域名的子域名,那么add_header不要在后面添加includeSubDomains,这时就变成:

add_header Public-Key-Pins 'pin-sha256="D5tCDvTlOey906WIwLSuJMpopHw5OuhXnYS/4Qyzlwk="; pin-sha256="V+3yq8vnC7oK/8f5FurGZi1fFm50nu92E6GBuSOUl6M="; pin-sha256="sFh1BtMheODncG38cu35FcVMv/eeO5nky69i8ZGyzY4=";max-age=2592000';

保存文件、退出,并重启Nginx。
然后到 https://www.ssllabs.com/ssltest/analyze.html?d=yourdomain.com 检查 HTTPS 的安全性。

参考资料:

Certbot and HTTP Public Key Pinning (HPKP)

鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,也欢迎指正,一起学习,共同进步。如果本文对您有帮助,而且让您觉得值得为内容付费,那么就请赞助(打赏)一下本人,这不强制。打赏支持微信支付,方法是使劲地戳一下下方的“打赏”按钮,然后得到微信收款的二维码,再用微信支付扫一下,就像买菜那样。祝好!