我正在尝试在 nginx 1.7.12 () 中设置公钥固定标头,Public-Key-Pins
但似乎遗漏了一些东西。我知道如何生成相关pin-sha256
字段。
我认为它会像这样工作:
- 如果我在标题中包含当前证书的 pin-sha256 值,那么一切都正常。
- 如果我不包含证书
pin-sha256
(也不包含任何中间证书或根证书),那么这应该意味着错误,并且浏览器应该:- 阻止访问该页面,
- 向控制台输出有关引脚的错误,
- 如果提供,则使用
report-uri
请求信息到达端点
到底发生了什么
对于情况 2,Firefox 中The site specified an invalid Public-Key-Pins header.
控制台中仅会出现警告,访问照常进行(情况 1 中没有警告,因此标头应该是正确的)。对于 Chrome,没有任何迹象表明 sha256 值与当前证书不匹配,访问始终正常。
(使用 Arch Linux 上的 Firefox 37 和 Chrome 41 进行测试)。
我遗漏了什么?标题的实际行为应该是什么?Public-Key-Pins
我如何在设置中触发错误,以便测试失败情况?
我当前的标题的形式如下(用于测试的简短最大年龄,正确填写FQDN
:
Public-Key-Pins: pin-sha256="XOwgEECL9p3X2PctwnsIvbV+ySJ975dNYbm8wxkjzXg="; pin-sha256="NxVoMtbt/y2GI3lV/ROFIcDyz8kj/W8JTtoszmBezOg="; pin-sha256="aM2laE5XUTDaWo6RnfKZ9OZHrNz/KQmRxCRO6YmWHGE="; max-age=900; report-uri="https://<FQDN>/hpkp";
答案1
为了被接受,您的 PIN 必须:
- 包含当前证书链的至少一个密钥
- 至少包含一个不在当前证书链中的密钥(“备份密钥”)。我认为您的情况缺少这个密钥。
测试一下:
- 使用 Firefox 开发版,进入网络选项卡,选择一个请求,选择右侧的安全选项卡。它必须显示“公钥锁定”状态
- 如果您确实想产生错误,请使用选项“包含子域”,并使用新密钥对任何子域进行签名。 Firefox 应该会拒绝连接。
一些文档: https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning
更具体地说:“如果我不包含证书的 pin-sha256(也不包含任何中间证书或根证书)”,那么浏览器不要保存密码. 浏览器仅在以下情况下显示连接错误:已保存的引脚列表与当前证书链不匹配。
https://scotthelme.co.uk/hpkp-toolset和https://report-uri.io/home/pkp_analyse可以帮助