【问题标题】:How Do We Generate a Base64-Encoded SHA256 Hash of SubjectPublicKeyInfo of an X.509 Certificate, for Android N Certificate Pinning?我们如何为 Android N 证书固定生成 X.509 证书的 SubjectPublicKeyInfo 的 Base64 编码 SHA256 哈希?
【发布时间】:2016-07-09 20:29:42
【问题描述】:

N Developer Preview 中有关其网络安全配置的文档提供了以下说明:

证书固定是通过通过公钥的哈希(X.509 证书的SubjectPublicKeyInfo)提供一组证书来完成的。只有当证书链包含至少一个固定的公钥时,证书链才有效。

他们显示的 XML 已损坏(缺少结束标记),但在其他方面表明哈希是 SHA256 和编码的 base64:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">fwza0LRMXouZHRC8Ei+4PyuldPDcf3UKgO/04cDM1oE=</pin>
    </domain-config>
</network-security-config>

我们如何创建这样的哈希?

我尝试了this gist 中的方法,但openssl x509 -inform der -pubkey -noout 不喜欢我的 CRT 文件。我无法轻易确定问题出在 CRT 文件、说明、我的 openssl 版本或其他问题上。

有没有人知道创建这个哈希的好方法?

【问题讨论】:

    标签: android x509certificate android-7.0-nougat


    【解决方案1】:

    用这个来获取在线https url的base64 sha256:

    openssl s_client -connect google.com:443 < /dev/null 2>/dev/null | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
    

    【讨论】:

      【解决方案2】:

      对于需要固定整个证书链的任何人,这些是我在幸运地安装了 Anaconda 的 Windows 10 机器上采取的步骤。

      1. 从 Chrome 或 Edge 保存证书文件。选择另存为 (.P7B) 的选项并确保选中“包括所有证书..”

      2. 双击文件。这应该会启动 windows certmgr。

      3. 单击“证书”后,您现在应该会看到证书链条目

      4. 右键单击每个证书链条目。选择所有任务并导出。

      5. 选择 DER 编码 (.CER)

      6. 对每个重复(注意层次结构)

      7. 启动 Anaconda 提示。

      8. 现在为每个文件运行@Alex Klyubin / @Gal Rom(上图)出色的命令。

        openssl x509 -inform DER -in prod_root.cer -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

      9. 为每个产生的文件。输出将是所需的 sha256

      希望这对某人有所帮助。我非常难以提取整个链条。我确信有更好的方法可以做到这一点,但它已经奏效了。

      【讨论】:

        【解决方案3】:

        要为已经上线的主机设置 Android network-security-config pinning,我更喜欢gnutls-cli(GnuTLS 客户端)。它以 sha256 可读可复制粘贴为 base64 编码的形式输出主机的证书信息。例如:

        $ gnutls-cli stackoverflow.com </dev/null
        <...>
         - subject `CN=*.stackexchange.com,O=Stack Exchange\, Inc.,L=New York,ST=NY,C=US', issuer `CN=DigiCert SHA2 High Assurance Server CA,OU=www.digicert.com,O=DigiCert Inc,C=US', serial 0x0e11bbd70d54b710d0c6f540b6b52ca4, RSA key 2048 bits, signed using RSA-SHA256, activated `2016-05-21 00:00:00 UTC', expires `2019-08-14 12:00:00 UTC', pin-sha256="2zKehMv7KtnGBz1d2U0bFrAOKb1aWWlrG9a0BzrOvwA="
        

        【讨论】:

        • 谢谢,实际上更容易了!如果您只想要别针而没有其他(在这种情况下)无趣的混乱:gnutls-cli YOUR_PINNING_DOMAIN_HERE 2&gt;/dev/null | grep -A 1 "Public Key PIN"
        • 是否有任何验证?我没有得到 sha256 指纹。
        【解决方案4】:

        openssl x509 -in cert.crt -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

        如果 cert.crt 是 DER 格式而不是 PEM 格式,您可能需要在第一个命令中添加 -inform der

        【讨论】:

        • 我只想补充一点,上面的 oneliner 假设 cert.crt 是 PEM 格式。如果你有DER格式的证书,你可以做cat cert.der | openssl dgst -sha256 -binary | openssl enc -base64而不用做双重转换。
        • 完美,在我的情况下它是 DER 格式,所以正如你建议的那样,我添加了 -inform der。这是我使用的生成正确值的命令:openssl x509 -inform DER -in TheCertificate.cer -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
        • 您好,请告诉我我需要将证书文件保存在哪里以执行此命令@GalRom
        猜你喜欢
        • 1970-01-01
        • 2017-04-09
        • 2018-12-12
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 2012-07-14
        • 2015-07-21
        相关资源
        最近更新 更多