公钥固定标头正确设置和故障测试

公钥固定标头正确设置和故障测试

我正在尝试在 nginx 1.7.12 () 中设置公钥固定标头,Public-Key-Pins但似乎遗漏了一些东西。我知道如何生成相关pin-sha256字段。

我认为它会像这样工作:

  1. 如果我在标题中包含当前证书的 pin-sha256 值,那么一切都正常。
  2. 如果我不包含证书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 必须:

  1. 包含当前证书链的至少一个密钥
  2. 至少包含一个不在当前证书链中的密钥(“备份密钥”)。我认为您的情况缺少这个密钥。

测试一下:

  • 使用 Firefox 开发版,进入网络选项卡,选择一个请求,选择右侧的安全选项卡。它必须显示“公钥锁定”状态
  • 如果您确实想产生错误,请使用选项“包含子域”,并使用新密钥对任何子域进行签名。 Firefox 应该会拒绝连接。

一些文档: https://developer.mozilla.org/en-US/docs/Web/Security/Public_Key_Pinning

更具体地说:“如果我不包含证书的 pin-sha256(也不包含任何中间证书或根证书)”,那么浏览器不要保存密码. 浏览器仅在以下情况下显示连接错误:已保存的引脚列表与当前证书链不匹配。

https://scotthelme.co.uk/hpkp-toolsethttps://report-uri.io/home/pkp_analyse可以帮助

相关内容