人生最大的错误是不断担心会犯错 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

Public-Key-Pins:配置 HPKP(Public Key Pinning Extension for HTTP)

工具 memory发布于December 18, 2016 标签: Nginx

HPKP 格式及说明

HTTP Public Key Pinning(HPKP)的格式如下:

Public-Key-Pins: pin-sha256="base64=="; max-age=expireTime [; includeSubdomains][; report-uri="reportURI"]

pin-sha256 即证书指纹,允许出现多次(实际上最少应该指定两个);
max-age 和 includeSubdomains 分别是过期时间和是否包含子域,它们在 HSTS(HTTP Strict Transport Security)中也有,格式和含义一致;
report-uri 用来指定验证失败时的上报地址,格式和含义跟 CSP(Content Security Policy)中的同名字段一致;
includeSubdomains 和 report-uri 均为可选。
为了验证合法性,pin-sha256 必须由网站当前证书链中的证书生成。例如我的网站证书有三级,用根证书、中间证书、站点证书中的任何一个生成指纹都可以。用站点证书生成指纹的好处是安全性最高,缺点是证书重签之后指纹就变了,如果之前没提供备用指纹,老用户无法访问;用根证书生成指纹安全性最差,因为每个根证书都对应很多中间证书,攻击者只要攻破其中一个,就可以签出能被 HPKP 策略信任的站点证书。
综合考虑安全性和易用性,一般推荐使用中间证书生成指纹;用知名 CA 的根证书也可以;不推荐使用站点证书,除非充分了解后果并且指定了有效的备用指纹。
备用指纹是为那些必须更换中间或者根证书的场景准备的 —— 例如原来的 CA 突然倒闭或者被黑了。本站当前使用的证书由 RapidSSL SHA256 CA – G4 签发,我的pin-sha256 包含了它的指纹;同时我还用 Let’s Encrypt Authority X1 这个中间证书生成了备用指纹。这样如果后续本站改为使用 Let’s Encrypt Authority X1 签发的证书,老用户也不会受影响。

生成 pin-sha256

从已知的密钥对(*.key)生成:

openssl rsa -in lvtao.net_ssl.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64

从已知的证书申请文件(*.csr)生成:

openssl req -in lvtao.net.csr -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

从已知的证书(*.crt)生成:

openssl x509 -in lvtao.net_bundle.crt -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

nginx配置:

add_header Public-Key-Pins 'pin-sha256="第一个base64"; pin-sha256="备用base64"; max-age=时长; includeSubDomains';

Public-Key-Pins:
  pin-sha256="GRAH5Ex+kB4cCQi5gMU82urf+6kEgbVtzfCSkw55AGk=";
  pin-sha256="lERGk61FITjzyKHcJ89xpc6aDwtRkOPAU0jdnUqzW2s=";
  max-age=15768000; includeSubDomains

一般来说,应至少提供两个 fingerprint(其中一个留做备用),而 max-age 应该尽量地长。

相关推荐

添加新评论

网站状态

  • 栏目分类:35个
  • 发布文章:1089篇
  • 用户评论:583条

最新回复

  • PHP程序员雷雪松: 非常详细的windows下MySQL的安装!!!
  • 嘿嘿: 高大上 嘿嘿
  • 嘿嘿: 呦西~~
  • memory: 实在是抱歉,我昨天找了一下我WIN电脑上的编译,发现当时编译完测...
  • kavid: 楼主发到我的邮箱呗 kavid@sina.com
  • 凯哥自媒体: 这个很不错,谢谢分享
  • memory: 在单位WINPC上,周一吧,我努力记着想死这事儿,到时候打包了发上来!
  • kavid: 楼主能把dll分享出来吗??正好我用的php 7.1php官方的...
  • zhaoliang0112: 厉害了,我哥的!!
  • zhaoliang0112: 希望能够有个系统的教程,就不要在去网上找了,直接这里学习!! :)
  • memory: 这是13年淘宝dba分享的一片文章,网上应该还有,我拿过来还没有...
  • wqintel: 而net.ipv4.tcp_mem则是配置tcp的内存大小,其单...
  • memory: 我这个站不是java写的哟~~~这是typecho开源博客程序改...
  • memory: 可以使用nginx反向代理后台的这个5000端口。
  • jarjar: 博主的java站好快啊
  • 凤凰山草民: java站这么快,厉害
  • 若铭: psdash可以部署到nginx上吗?
  • PHP程序员雷雪松: 很实用的PHP代码块!!!
  • codes: 把 .dll 发出来让我试试啊
  • 凯哥自媒体: 这个挺不错的