fangpsh's blog

关闭HPKP 和HSTS的方法

大家对于HSTS 一般都比较熟悉了,对HPKP 可能比较陌生,简单来说由于CA 的工作模式,导致别人有可能通过其他CA 签发你网站的证书,这个时候你就需要有一条头信息声明你网站的证书的指纹是什么。
关于HSTS 和HPKP 的介绍可以查看Jerry Qu 的这2篇文章:

HSTS 和HPKP 都是通过头信息传递给浏览器,浏览器都会根据max-age 缓存起来,所以在添加了HSTS 和HPKP 了之后,想要回滚,就没有在服务端回滚程序那么方便了。

有以下几种情况会遇到要关闭/移除:

HSTS: 运维同学在刚刚做HTTPS 的时候,开启了HSTS,甚至加了includeSubDomains,某些老客户端访问HTTP的接口的时候跳到HTTS,由于SNI、加密套件兼容性等问题出现故障;

HPKP: 无论是用根证书、中间证书还是站点证书签发了指纹,虽然HPKP有备份方案,即发送多个pin-sha,但是还是需要准备证书出现故障,要关闭HPKP。另外要记得添加report-uri,这样出错时,服务端能主动的发现上报的信息。

个人觉得HPKP 和HSTS 在设计上实在太像了,如下例子:

HSTS:

Strict-Transport-Security: max-age=31536000; includeSubDomains

HPKP:

Public-Key-Pins:
      pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";
      pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";
      pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";
      max-age=10000; includeSubDomains

所以在关闭,或者说移除HSTS或HPKP的方式上也是一样的。

即max-age 字段指定为0

看下RFC:

HTST(RFC6797):

The max-age value is essentially a "time to live" value relative
to the reception time of the STS header field.

If the max-age header field value token has a value of zero, the
UA MUST remove its cached HSTS Policy information (including the
includeSubDomains directive, if asserted) if the HSTS Host is
known, or the UA MUST NOT note this HSTS Host if it is not yet
known.

HPKP(RFC7469):

The max-age value is essentially a "time to live" value relative to
the time of the most recent observation of the PKP header field.  If
the max-age header field value token has a value of 0, the UA MUST
remove its cached Pinning Policy information (including the
includeSubDomains directive, if asserted) if the Pinned Host is
Known, or, MUST NOT note this Pinned Host if it is not yet Known.

果然很像。。。居然照抄。
另外includeSubdomains 两者的定义也是一样的。