三月份时蓝点网介绍了在HTTPS加密安全传输里有关 HSTS 严格安全传输的部分内容及服务器上的部署教程。
HSTS解决的问题是用户在直接访问 HTTP 明文连接向 HTTPS 加密连接进行重定向时可能遭遇到的劫持问题。
这篇文章将向大家介绍网站安全访问 HPKP 公钥扎钉的内容,公钥扎钉主要解决是证书颁发机构的安全风险。
什么是HPKP公钥扎钉:
公钥扎钉主要是为网站所使用的证书生成固定的哈希值, 然后在用户访问时将这个哈希值传递给浏览器保留。
而在用户下次访问时浏览器会先核对证书哈希值与此前留存的哈希值是否相同, 如果不同那么将会断开连接。
进行公钥扎钉后即使网站使用的是合法证书但哈希值不同, 那么浏览器也会按照默认策略及时断开网络连接。
公钥扎钉的意义何在:
公钥扎钉主要解决的问题是若某个合法的CA证书颁发机构遭到攻击而签发了不该签发的证书被用来劫持网站。
举例如下:证书颁发机构A遭到黑客攻击为网站B签发了证书C,攻击者D通过这个合法证书C劫持用户的访问。
在上述场景中由于证书C本身是合法的证书因此浏览器不会拦截,但实际上用户的访问却已经遭到了D的劫持。
而证书颁发机构A可能因为各种原因导致签发了证书C,例如遭到黑客攻击或者故意签发证书 C用来劫持等等。
HPKP 公钥扎钉可以让管理员指定浏览器只接受自己的证书, 即使其他证书颁发机构签发的合法证书也拦截。
公钥扎钉可能带来的麻烦:
如果前期已经部署了公钥扎钉固定了正在使用的证书信息,这个时候这个证书出现问题需要更换那就麻烦了。
更换证书意味着原本浏览器留存的哈希值和当前哈希值不同,因此浏览器会直接拦截掉老用户正常访问请求。
为了解决这个问题公钥扎钉固定的证书哈希值通常是中级证书,也就是你使用证书的上级 CA 证书颁发机构。
这样证书需要更换但依然还是由相同的CA机构颁发, 在上级CA机构没有变的情况下证书哈希值自然相同的。
那么上级CA颁发机构是否会出现问题呢?显然该情况存在, 因此在部署公钥扎钉时通常我们会部署两个CA。
部署前须知:
蓝点网目前主要使用的是由中级证书颁发机构TrustAsia亚洲诚信签发的通配符证书,亚信上级为 VeriSign。
蓝点网还有个是中级证书颁发机构科莫多COMODO签发的普通证书,科莫多的上级颁发机构是 UserTrust。
因此蓝点网选择进行主备用公钥扎钉的分别是亚洲诚信和科莫多的中级证书,即这固定这两个证书的哈希值。
1、首先你需要前往证书颁发机构那里取得对应的中级证书,通常在证书颁发机构给你签发的证书包里会有;
2、我们将两个中级证书分别命名为trustasia.pem和comodo.pem (若是crt格式可直接将后缀改成pem);
3、将这两个证书上传至Linux服务器的Root目录中,然后通过SSH连接服务器对证书进行校验并生成哈希值;
#首先对证书进行校验,核对证书信息是否正确 openssl x509 -in trustasia.pem -noout -subject subject= /C=CN/O=TrustAsia Technologies, Inc./OU=Symantec Trust Network/OU=Domain Validated SSL/CN=TrustAsia DV SSL CA - G5
#接着生成Public.key
openssl x509 -in tr.pem -noout -pubkey | openssl asn1parse -noout -inform pem -out public.key
#生成后再取得证书的哈希值
openssl dgst -sha256 -binary public.key | openssl enc -base64
#亚洲诚信中级证书的哈希值
IiSbZ4pMDEyXvtl7Lg8K3FNmJcTAhKUTrB2FQOaAO/s=
#同样操作再对科莫多的证书获取哈希值 openssl x509 -in com.pem -noout -subject subject= /C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Domain Validation Secure Server CA
openssl x509 -in comodo.pem -noout -pubkey | openssl asn1parse -noout -inform pem -out public.key openssl dgst -sha256 -binary public.key | openssl enc -base64 #科莫多中级证书的哈希值 klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=
4、现在我们已经分别获得了亚洲诚信和科莫多中级证书的哈希值,接下来将哈希值添加到网站配置文件中。
5、以Nginx为例:修改网站的配置文件conf并加入公钥扎钉设置:
add_header Public-Key-Pins 'pin-sha256="IiSbZ4pMDEyXvtl7Lg8K3FNmJcTAhKUTrB2FQOaAO/s="; pin-sha256="klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY="; max-age=2592000; includeSubDomains';
其中ping-sha256后的分别是亚洲诚信和科莫多中级证书的哈希值,请在修改时改成你获取到的证书哈希值。
6、保存conf文件再上传到服务器上然后重启Nginx服务service nginx restart即可,然后用SSLLABS测试下。
7、测试成功的话SSLLABS会在HPKP选项里出现你配置好的两个哈希值, 到这里HPKP公钥扎钉配置已完成。
只有一个证书怎么办?
如果你只有一个证书那么可以将Mozilla旗下的免费证书项目的中级证书取得哈希值然后进行HPKP公钥扎钉。
Lets Encrypt 签发的证书本身是免费签发的,因此假如你现有的证书出现问题可以让去签发个新的证书使用。
原理是你固定的已经是 Lets Encrypt Authority X3 证书哈希,而通过Mozilla新签发的证书由前面证书签发。
(本文参考了HTTP Public Key Pinning 介绍 - JerryQu的小站)
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/31399.html