为 HTTPS 网站开启 HPKP( Public Key Pinning) - V2EX
sparanoid
V2EX    SSL

为 HTTPS 网站开启 HPKP( Public Key Pinning)

  •  
  •   sparanoid 2015-10-13 21:49:38 +08:00 6465 次点击
    这是一个创建于 3709 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在折腾 HPKP ,总结一下

    介绍

    HPKP 简单说就是在 HTTP 头中定义一组 Base64 编码的 SPKI 指纹,在支持 HPKP 的浏览器中,浏览器会先对比 HTTP 头中的 SPKI 指纹与当前证书的的实际指纹,从而可以一定程度上防止伪造证书的中间人攻击,更多请参考 https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning

    语法

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

    要点

    • pin-sha256 至少要有两个,第一个必须在当前证书链中,后面的作为备份证书,必须不在当前的证书链中,也就是说你可以在后面的 pin 中用完全不存在的指纹,但会有安全隐患
    • 你也可以 pin 中继链,这样就不用每次换证书的时候都换指纹,但如果你的 CA 的证书不是很难搞到的话这样也会有隐患(如有错误请指教)
    • 如果需要更换 SSL 证书,需要在定义的 max-age 之前就将新证书的指纹放入备用 pin 中

    指纹生成方法

    # RSA key $ openssl rsa -in my.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64 # ECDSA (例如 COMODO ECC ) $ openssl ec -in my.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64 

    Nginx 设置

    add_header Public-Key-Pins 'pin-sha256="ABCD"; pin-sha256="EFGI"; max-age=86400'; 

    测试

    Chrome 中打开 chrome://net-internals/#hsts ,然后请求( query )当前域名后,如果设置正确的话会看到类似下面的结果:

    dynamic_sts_domain: ci.sparanoid.com dynamic_upgrade_mode: STRICT dynamic_sts_include_subdomains: true dynamic_sts_observed: 1443522549.33342 dynamic_pkp_domain: ci.sparanoid.com dynamic_pkp_include_subdomains: true dynamic_pkp_observed: 1443522549.333427 dynamic_spki_hashes: sha256/6X0iNAQtPIjXKEVcqZBwyMcRwq1yW60549axatu3oDE=,sha256/klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY= 

    Firefox 可以在 Web Inspector 的 Network 标签查看

    Qualys SSL Labs 可以在测试结果中看到(例子

    HPKP Reporting

    当浏览器检测到指纹不匹配时,可以 POST 请求到一个制定的地址,这里推荐使用 RequestBin 进行调试:

    add_header Public-Key-Pins-Report-Only 'pin-sha256="FAKE"; pin-sha256="EFGI"; max-age=86400; report-uri="http://requestb.in/onk0wkon"'; 

    目前只有 Chrome 46 支持 Public-Key-Pins-Report-Only

    第 1 条附言    2015-11-22 00:24:08 +08:00
    发现一个专注于 HPKP 和 CSP 的服务: https://report-uri.io/
    8 条回复    2015-12-06 20:49:38 +08:00
    xfspace
        1
    xfspace  
       2015-10-13 22:10:30 +08:00
    然而...这些新功能特性,大公司并没用上。
    sparanoid
        2
    sparanoid  
    OP
       2015-10-13 22:30:14 +08:00 via iPhone
    @xfspace 然而 Google 、 GitHub 都用上了 :)
    c742435
        3
    c742435  
       2015-10-13 23:08:55 +08:00
    @sparanoid 然而用上了是不是就没办法用 fiddler 调试了
    xfspace
        4
    xfspace  
       2015-10-14 01:40:16 +08:00 via Android
    @sparanoid 国内的...国外的恨不得你用新的东西,兼容旧版本是多么痛苦!
    lenovo
        5
    lenovo  
       2015-10-21 16:41:12 +08:00
    @sparanoid 请问备份的 pin-sha256 怎么生成?谢谢
    sparanoid
        6
    sparanoid  
    OP
       2015-10-21 18:51:34 +08:00 via iPhone
    @lenovo 生成方法和第一个 pin 一样,用备用证书生成就可以了
    lenovo
        7
    lenovo  
       2015-10-21 22:40:27 +08:00
    @< href="/member/sparanoid">sparanoid 多谢,用之前过期的证书生成了一个:)
    ahu
        8
    ahu  
       2015-12-06 20:49:38 +08:00
    Generating the SPKI Fingerprint 有 3 种方法:

    Given the public key pub.key:

    openssl rsa -pubout -in pub.key -outform der | \
    openssl dgst -sha256 -binary | \
    base64
    Given the CSR my.csr:

    openssl req -noout -in my.csr -pubkey | \
    openssl rsa -pubin -outform der | \
    openssl dgst -sha256 -binary | \
    base64
    Or given the PEM-encoded certificate certificate.pem:

    openssl x509 -noout -in certificate.pem -pubkey | \
    openssl rsa -pubin -outform der | \
    openssl dgst -sha256 -binary | \
    base64
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5705 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 06:21 PVG 14:21 LAX 22:21 JFK 01:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86