65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2016 年 3 月 5 日

CPOL

12分钟阅读

viewsIcon

21075

HTTP 公钥钉扎 (HPKP)。

目录

引言

本文向读者分享了如何实现 HTTP 公钥固定 (HPKP) 安全策略/控件的步骤。本文还包括了创建自签名证书、实现安全控件的步骤以及一些验证控件的技巧。

以下是关于 HPKP 的一些总结,来自 MozillaOWASP

请注意,HPKP 尚未与所有浏览器兼容,但尝试一下也无妨。您无需拥有信誉良好的 CA 签名的有效证书即可了解 HPKP 的工作原理。

希望本文能帮助您在环境中实现此安全策略,或为您未来的机会做好准备。

通过 IIS 创建自签名证书

通过 IIS 创建 SSL 自签名服务器证书

  1. 在 IIS 管理器中,单击服务器名称
  2. 在“功能视图”中,单击“服务器证书”
  3. 在“操作”下,单击“创建自签名证书”
  4. 为证书指定一个友好名称,在此示例中,我将其命名为 MyCert1

图 1

create SSL self signed server certificate through IIS

使用 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
openssl variables

 

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
openssl create SSL

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 create PFX

使用 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
openssl create SSL Chain
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
openssl Complete CSR
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
Certificate General tab

单击“证书路径”选项卡。在“证书状态”下,会有一条消息“此 CA 根证书不受信任,因为它不在受信任的根证书颁发机构存储中”和“找不到此证书的颁发者”。此外,子证书路径未显示 myninja.ysa 作为根。请参考图 7 和图 8。

图 8
Certificate Path tab

为此,请单击 myninja.ysa 证书的“常规”选项卡。单击“安装证书”按钮。将证书放置在“受信任的根证书颁发机构”中。最后单击“完成”以完成过程。您将看到一个安全警告提示“您将要安装来自声称代表 myninja.ysa 的证书颁发机构 (CA) 的证书…您要安装此证书吗”,单击“是”继续。之后双击证书,您应该会看到证书状态显示“此证书有效。”并且链证书路径显示 myninja.ysa 作为根,如图 9 所示。

图 9
Certificate OK

将证书导入 IIS 服务器证书

在本节中,我们将介绍将证书导入 IIS 的步骤

  1. 在 IIS 管理器中,单击服务器名称
  2. 在“功能视图”中,单击“服务器证书”
  3. 在“操作”下,单击“导入…”
  4. 浏览到 MyCerts 文件夹并选择 myninja.ysa.pfx,输入密码
  5. 对 sub.myninja.ysa.pfx 重复步骤 4
  6. 最终,您应该在“服务器证书”下看到三个证书

图 10
IIS Server Certificates

将 SSL 绑定到站点

将 SSL 证书绑定到站点

  1. 在 IIS 管理器中,展开服务器名称
  2. 选择站点
  3. 在“操作”菜单下,单击“绑定…”
  4. 单击“添加”,选择“类型”为 https。如果端口不是 443,请输入不同的端口号。在“SSL 证书”下,选择 myninja.ysa,单击“确定”并“关闭”以完成步骤
  5. 您可以重复以上步骤来尝试其他证书

图 11
IIS Server SSL binding

配置 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
Primary pin
或者,由于我已有证书,我也可以通过提供证书来运行以下命令来生成指纹

列表 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
Primary pin 2
最终,这两种方法都会生成相同的指纹 (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
backup pin
如果将所有内容放在一起,标头将看起来像列表 11。max-age 最初设置为 10 秒,一旦确认一切正常,您可以将其设置为一年或六个月。

列表 11

     pin-sha256='aCJgrjda9Bvvpx791OQ8g6wksucYBFpmV3gX5sTEqyc='; pin-sha256='Mq5prDs0m6V/+DEFM/ML3NysUtYTur+Pwoqzk8ZA0w0='; max-age=10; includeSubdomains;

在 IIS 中配置 HPKP

在本节中,我们将简要讨论在 IIS 上设置 HPKP 的步骤。

  1. 在 IIS 管理器中,展开服务器名称
  2. 选择站点
  3. 在“功能视图”中,双击“HTTP 响应标头”
  4. 在“操作”下,单击“添加…”
  5. 输入名称:Pubic-Key-Pins,值来自列表 11

图 15
IIS HPKP
另一种实现此目的的方法是通过 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
chrome error

导出证书

有很多方法可以完成此任务,但现在,我们将使用 Google Chrome。首先打开 Google Chrome 浏览器,导航到网站。您首先看到的是“您的连接不安全”警告。单击 URL 上的挂锁图标,然后单击“连接”选项卡下的“证书”链接。单击“详细信息”选项卡,然后单击“复制到文件…”按钮,单击“下一步”继续。在“导出文件格式”屏幕上,选择“DER 编码二进制 X.509 (.CER)”,单击“下一步”继续。选择一个位置保存证书文件,单击“下一步”和“完成”以完成证书导出过程。

安装证书

浏览到证书的位置,双击它,在“常规”选项卡下单击“安装证书”。保留默认选项,单击“下一步”继续。在“证书存储”屏幕上,选择“将所有证书放入以下存储”,单击“浏览”并选择“受信任的根证书颁发机构”,然后单击“确定”关闭窗口。然后单击“下一步”按钮继续,再单击“完成”按钮完成安装。将弹出警告消息,单击“是”按钮继续。

在 Internet Explorer (IE) 浏览器上实现相同的功能会更简单。步骤如下:右键单击 IE 浏览器,然后单击“以管理员身份运行”。单击 URL 上的证书错误,然后单击“查看证书”。在“常规”选项卡下,单击“安装证书…”按钮,然后重复上述步骤以完成证书安装。

图 17
ie error

我的另一个建议是,将证书 (myninja.ysa.cer) 复制到客户端计算机并安装它。

查看安全控件/策略的实际效果

现在打开 Google Chrome 浏览器并导航到 https://myninja.ysa。您应该会看到图 16 和图 18 之间的区别,证书错误不再是问题。

图 18
chrome ok

在同一浏览器中,打开一个新标签页。在 URL 中输入 chrome://net-internals/#hsts,然后按 Enter。返回到上一个标签页并刷新页面,然后单击第二个标签页 (chrome://net-internals/#hsts),在“查询域”下的域文本框中输入 myninja.ysa。单击“查询”按钮,如果一切设置正确,您应该会看到与图 19 类似的结果。

图 19
chrome_query

接下来,打开 web.config,通过在密钥开头添加一个随机字符来修改主密钥。保存,然后重启 IIS 以确保。在 Chrome 浏览器中,刷新第一个标签页 (https://myninja.ysa),在第二个标签页中,在“查询域”下的域文本框中输入 myninja.ysa。单击“查询”按钮,并将图 19 和图 20 的结果进行比较。您会注意到蓝色圆点中的字段为空。在某些情况下,如果密钥无效,您将看到“未找到”消息。

图 20
invalid key

继续,从 web.config 中删除随机字符。在 Chrome 浏览器中,刷新第一个标签页,在第二个标签页中,在“查询域”下的域文本框中输入 myninja.ysa。您应该会再次看到与图 19 类似的结果。

如果您的网站是公开的,您可以通过 https://securityheaders.io/ 扫描标头。如果您想保持私密,请确保选中“隐藏结果”复选框。

回想一下,证书固定的目的之一是为了防止攻击者进行中间人攻击 (MITM)。我想到的一件事是使用 Fiddler 作为示例。如果您没有 Fiddler,请下载一份,它是免费的,网址是 http://www.telerik.com/fiddler。打开 Fiddler 并刷新网站,您将看到图 21 中的结果。单击“高级”链接以切换详细信息。关闭 Fiddler 并再次刷新页面。您会注意到页面正常加载,没有警告消息。

图 21
Chrome_error_fiddler

接下来,打开 web.config,通过向主密钥添加一个随机字符来篡改公钥固定。清除浏览器缓存 (Ctrl + Shift + Del),然后再次导航到网站。打开 Fiddler 并刷新网站,您应该会看到图 22 中的结果。注意图 21 和图 22 中的消息之间的区别。后者有一个链接“继续访问 myninja.ysa (不安全)”,它允许用户继续访问该站点。

图 22
Chrome_error_fiddler hsts
 

看点

如果您注意到图 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

© . All rights reserved.