不安全的传输 – 缺少公钥钉扎





5.00/5 (2投票s)
HTTP 公钥钉扎 (HPKP)。
目录
- 引言
- 通过 IIS 创建自签名证书
- 使用 OpenSSL 创建自签名证书
- 使用 OpenSSL 创建证书链
- 将证书导入 IIS 服务器证书
- 将 SSL 绑定到站点
- 配置 HPKP
- 创建主固定
- 创建备用固定
- 在 IIS 中配置 HPKP
- 如何测试?
- 查看安全控件/策略的实际效果
- 看点
- 结论
- 历史
- 资源
引言
本文向读者分享了如何实现 HTTP 公钥固定 (HPKP) 安全策略/控件的步骤。本文还包括了创建自签名证书、实现安全控件的步骤以及一些验证控件的技巧。
以下是关于 HPKP 的一些总结,来自 Mozilla 和 OWASP。
请注意,HPKP 尚未与所有浏览器兼容,但尝试一下也无妨。您无需拥有信誉良好的 CA 签名的有效证书即可了解 HPKP 的工作原理。
希望本文能帮助您在环境中实现此安全策略,或为您未来的机会做好准备。
通过 IIS 创建自签名证书
通过 IIS 创建 SSL 自签名服务器证书
- 在 IIS 管理器中,单击服务器名称
- 在“功能视图”中,单击“服务器证书”
- 在“操作”下,单击“创建自签名证书”
- 为证书指定一个友好名称,在此示例中,我将其命名为 MyCert1
图 1
使用 OpenSSL 创建自签名证书
使用 OpenSSL 创建 SSL 自签名服务器证书,请参阅下文
1. 下载并安装 Windows 版 OpenSSL
2. 打开命令提示符,导航到 OpenSSL bin 文件夹
3. 在列表 1 中输入命令以设置环境变量
列表 1
set OPENSSL_CONF=C:\OpenSSL-Win32\bin\openssl.cfg set RANDFILE=C:\OpenSSL-Win32\bin\.rnd
图 2
4. 输入以下命令以使用 x509 结构和密钥文件创建具有 4096 位的新自签名证书。证书有效期为 365 天
列表 2
openssl req -newkey rsa:4096 -days 365 -x509 -nodes -out mycerts\myninja.ysa.cer -keyout mycerts\myninja.ysa.key
5. 系统会提示您输入国家/地区名称、州等…由于我的网站 URL 是 myninja.ysa,因此通用名称将是 myninja.ysa
图 3
6. 接下来,我们将使用证书和密钥通过列表 3 中的命令生成 PKCS#12/PFX。此命令将生成一个友好名称为“myninja.ysa”的 .pfx 文件。我们将在后续部分将证书导入 IIS。
列表 3
openssl pkcs12 -export -out mycerts\myninja.ysa.pfx -inkey mycerts\myninja.ysa.key -in mycerts\myninja.ysa.cer -name "myninja.ysa"
7. 系统会提示您输入导出证书的密码。您可以按两次 Enter 键将其留空
图 4
使用 OpenSSL 创建证书链
如果您有兴趣使用 OpenSSL 创建自签名服务器证书链,请按照以下步骤操作
1. 假设根/CA 是 myninja.ysa,在列表 4 中输入命令以创建证书签名请求 (CSR) 或证书请求
列表 4
openssl req -newkey rsa:4096 -nodes -out mycerts\sub.myninja.ysa.csr -key mycerts\myninja.ysa.key
2. 系统会提示您输入国家/地区名称、州等…假设我的网站 URL 是 sub.myninja.ysa,在通用名称下,我将输入 sub.myninja.ysa
图 5
3. 运行列表 5 中的以下命令以完成请求。您可以从 此处 阅读更多内容,以了解 OpenSSL 选项/参数的定义
列表 5
openssl x509 -req -days 365 -in mycerts\sub.myninja.ysa.csr -CA mycerts\myninja.ysa.cer -CAkey mycerts\myninja.ysa.key -set_serial 01 -out mycerts\sub.myninja.ysa.cer
4. 图 6 显示了输出,新证书将在 mycerts\sub.myninja.ysa.cer 文件夹下创建
图 6
5. 我们使用列表 6 中的命令生成 PKCS#12/PFX,以便将其导入 IIS 服务器证书
列表 6
openssl pkcs12 -export -out mycerts\sub.myninja.ysa.pfx -inkey mycerts\myninja.ysa.key -in mycerts\sub.myninja.ysa.cer -name "sub.myninja.ysa"
接下来,我们将花一分钟时间检查新创建的证书。导航到 mycerts 文件夹,双击打开 myninja.ysa.cer 和 sub.myninja.ysa.cer 证书,如图 7 所示。
图 7
单击“证书路径”选项卡。在“证书状态”下,会有一条消息“此 CA 根证书不受信任,因为它不在受信任的根证书颁发机构存储中”和“找不到此证书的颁发者”。此外,子证书路径未显示 myninja.ysa 作为根。请参考图 7 和图 8。
图 8
为此,请单击 myninja.ysa 证书的“常规”选项卡。单击“安装证书”按钮。将证书放置在“受信任的根证书颁发机构”中。最后单击“完成”以完成过程。您将看到一个安全警告提示“您将要安装来自声称代表 myninja.ysa 的证书颁发机构 (CA) 的证书…您要安装此证书吗”,单击“是”继续。之后双击证书,您应该会看到证书状态显示“此证书有效。”并且链证书路径显示 myninja.ysa 作为根,如图 9 所示。
图 9
将证书导入 IIS 服务器证书
在本节中,我们将介绍将证书导入 IIS 的步骤
- 在 IIS 管理器中,单击服务器名称
- 在“功能视图”中,单击“服务器证书”
- 在“操作”下,单击“导入…”
- 浏览到 MyCerts 文件夹并选择 myninja.ysa.pfx,输入密码
- 对 sub.myninja.ysa.pfx 重复步骤 4
- 最终,您应该在“服务器证书”下看到三个证书
图 10
将 SSL 绑定到站点
将 SSL 证书绑定到站点
- 在 IIS 管理器中,展开服务器名称
- 选择站点
- 在“操作”菜单下,单击“绑定…”
- 单击“添加”,选择“类型”为 https。如果端口不是 443,请输入不同的端口号。在“SSL 证书”下,选择 myninja.ysa,单击“确定”并“关闭”以完成步骤
- 您可以重复以上步骤来尝试其他证书
图 11
配置 HPKP
这是 HPKP 语法
Public-Key-Pins: pin-sha256="base64_Primary_Key"; pin-sha256="base64_Backup_Key"; max-age=Expire_Time; includeSubdomains;
以下是对参数的简要说明
Pin-sha256 指令 - Base64 编码的主题公钥信息 (SPKI) 指纹。
max-age 指令 - 浏览器应存储固定详细信息的秒数
可选 includeSubDomains 指令 - 包含所有子域
创建主固定
有几种方法可以生成主密钥指纹。假设我的站点的 URL 是 https://myninja.ysa/,然后我可以运行列表 7 中的命令来生成证书指纹。总之,该命令连接到主机,从证书中读取公钥并将其编码为 base64。
列表 7
openssl s_client -host myninja.ysa -connect myninja.ysa:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
图 12 显示了列表 7 中命令的输出。按 Control + C 返回提示符。
图 12
或者,由于我已有证书,我也可以通过提供证书来运行以下命令来生成指纹
列表 8
openssl x509 -in mycerts\myninja.ysa.cer -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
图 13 显示了列表 8 中命令的结果。
图 13
最终,这两种方法都会生成相同的指纹 (aCJgrjda9Bvvpx791OQ8g6wksucYBFpmV3gX5sTEqyc=)。
创建备用固定
我在 Scott Helme 的网站上找到了关于备用固定的优秀读物。他指出我们可以创建一些备用的 CSR 并将它们的指纹包含在标头中。要创建 CSR,请先运行以下命令。
列表 9
openssl req -newkey rsa:4096 -nodes -out mycerts\MyBackup1.csr -keyout mycerts\MyBackup1.key
然后运行以下命令生成指纹
列表 10
openssl req -pubkey < mycerts\MyBackup1.csr | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
图 14 显示了列表 10 中命令的输出
图 14
如果将所有内容放在一起,标头将看起来像列表 11。max-age 最初设置为 10 秒,一旦确认一切正常,您可以将其设置为一年或六个月。
列表 11
pin-sha256='aCJgrjda9Bvvpx791OQ8g6wksucYBFpmV3gX5sTEqyc='; pin-sha256='Mq5prDs0m6V/+DEFM/ML3NysUtYTur+Pwoqzk8ZA0w0='; max-age=10; includeSubdomains;
在 IIS 中配置 HPKP
在本节中,我们将简要讨论在 IIS 上设置 HPKP 的步骤。
- 在 IIS 管理器中,展开服务器名称
- 选择站点
- 在“功能视图”中,双击“HTTP 响应标头”
- 在“操作”下,单击“添加…”
- 输入名称:Pubic-Key-Pins,值来自列表 11
图 15
另一种实现此目的的方法是通过 web.config 添加标头。请参考列表 12 以了解标头插入位置。
列表 12
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <httpProtocol> <customHeaders> <clear /> <add name="Public-Key-Pins" value="pin-sha256='aCJgrjda9Bvvpx791OQ8g6wksucYBFpmV3gX5sTEqyc='; pin- sha256='Mq5prDs0m6V/+DEFM/ML3NysUtYTur+Pwoqzk8ZA0w0='; max-age=10; includeSubdomains;" /> </customHeaders> </httpProtocol> </system.webServer> </configuration>
如何测试?
首先,我们需要一个有效的证书或由受信任的 CA 签名的证书。如果证书不是由有效 CA 签名的,您将看到与图 16 类似的错误消息。这没关系,我们可以手动将证书添加到客户端计算机的信任存储中。本节介绍在客户端计算机上导出和安装证书的步骤。
图 16
导出证书
有很多方法可以完成此任务,但现在,我们将使用 Google Chrome。首先打开 Google Chrome 浏览器,导航到网站。您首先看到的是“您的连接不安全”警告。单击 URL 上的挂锁图标,然后单击“连接”选项卡下的“证书”链接。单击“详细信息”选项卡,然后单击“复制到文件…”按钮,单击“下一步”继续。在“导出文件格式”屏幕上,选择“DER 编码二进制 X.509 (.CER)”,单击“下一步”继续。选择一个位置保存证书文件,单击“下一步”和“完成”以完成证书导出过程。
安装证书
浏览到证书的位置,双击它,在“常规”选项卡下单击“安装证书”。保留默认选项,单击“下一步”继续。在“证书存储”屏幕上,选择“将所有证书放入以下存储”,单击“浏览”并选择“受信任的根证书颁发机构”,然后单击“确定”关闭窗口。然后单击“下一步”按钮继续,再单击“完成”按钮完成安装。将弹出警告消息,单击“是”按钮继续。
在 Internet Explorer (IE) 浏览器上实现相同的功能会更简单。步骤如下:右键单击 IE 浏览器,然后单击“以管理员身份运行”。单击 URL 上的证书错误,然后单击“查看证书”。在“常规”选项卡下,单击“安装证书…”按钮,然后重复上述步骤以完成证书安装。
图 17
我的另一个建议是,将证书 (myninja.ysa.cer) 复制到客户端计算机并安装它。
查看安全控件/策略的实际效果
现在打开 Google Chrome 浏览器并导航到 https://myninja.ysa。您应该会看到图 16 和图 18 之间的区别,证书错误不再是问题。
图 18
在同一浏览器中,打开一个新标签页。在 URL 中输入 chrome://net-internals/#hsts,然后按 Enter。返回到上一个标签页并刷新页面,然后单击第二个标签页 (chrome://net-internals/#hsts),在“查询域”下的域文本框中输入 myninja.ysa。单击“查询”按钮,如果一切设置正确,您应该会看到与图 19 类似的结果。
图 19
接下来,打开 web.config,通过在密钥开头添加一个随机字符来修改主密钥。保存,然后重启 IIS 以确保。在 Chrome 浏览器中,刷新第一个标签页 (https://myninja.ysa),在第二个标签页中,在“查询域”下的域文本框中输入 myninja.ysa。单击“查询”按钮,并将图 19 和图 20 的结果进行比较。您会注意到蓝色圆点中的字段为空。在某些情况下,如果密钥无效,您将看到“未找到”消息。
图 20
继续,从 web.config 中删除随机字符。在 Chrome 浏览器中,刷新第一个标签页,在第二个标签页中,在“查询域”下的域文本框中输入 myninja.ysa。您应该会再次看到与图 19 类似的结果。
如果您的网站是公开的,您可以通过 https://securityheaders.io/ 扫描标头。如果您想保持私密,请确保选中“隐藏结果”复选框。
回想一下,证书固定的目的之一是为了防止攻击者进行中间人攻击 (MITM)。我想到的一件事是使用 Fiddler 作为示例。如果您没有 Fiddler,请下载一份,它是免费的,网址是 http://www.telerik.com/fiddler。打开 Fiddler 并刷新网站,您将看到图 21 中的结果。单击“高级”链接以切换详细信息。关闭 Fiddler 并再次刷新页面。您会注意到页面正常加载,没有警告消息。
图 21
接下来,打开 web.config,通过向主密钥添加一个随机字符来篡改公钥固定。清除浏览器缓存 (Ctrl + Shift + Del),然后再次导航到网站。打开 Fiddler 并刷新网站,您应该会看到图 22 中的结果。注意图 21 和图 22 中的消息之间的区别。后者有一个链接“继续访问 myninja.ysa (不安全)”,它允许用户继续访问该站点。
图 22
看点
如果您注意到图 21,消息说“您现在无法访问 myninja.ysa,因为该网站使用了 HSTS”。我不确定为什么它会说 HSTS 而不是 HPKP。HTTP 严格传输安全 (HSTS) 是另一个重要的安全策略,它强制所有通信都通过 HTTPS 发送。您可以从 此处 获取有关如何实现它的信息。
需要记住的另一件事是,每次续订/替换站点 SSL 证书时,都需要更新 HPKP 配置。如开头所述,此安全策略尚未与所有浏览器兼容,OWASP 将其评为低风险。了解它的工作原理对未来的发展总是有益的。
结论
我希望有人会发现这些信息有用,并为您未来的机会做好准备。如果您发现任何错误、不同意内容或想帮助改进本文,请给我留言,我将与您合作纠正。
历史
2016 年 3 月 4 日 – 初始版本
资源
https://www.sslshopper.com/article-most-common-openssl-commands.html
http://luke.breuer.com/time/item/Generating_an_SSL_certificate_on_Windows_without_IIS/634.aspx
https://slproweb.com/products/Win32OpenSSL.html
https://langui.sh/2009/01/18/openssl-self-signed-ca/
https://scotthelme.co.uk/hardening-your-http-response-headers/
https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
https://mdn.org.cn/en-US/docs/Web/Security/Public_Key_Pinning
https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning