我们如何为Android N证书固定生成X.509证书的SubjectPublicKeyInfo的Base64编码SHA256哈希?

我们如何为Android N证书固定生成X.509证书的SubjectPublicKeyInfo的Base64编码SHA256哈希?,android,x509certificate,android-7.0-nougat,Android,X509certificate,Android 7.0 Nougat,N Developer预览版中有关其网络安全配置的文档提供了以下说明: 通过公钥散列(X.509证书的SubjectPublicKeyInfo)提供一组证书来完成证书固定。只有当证书链包含至少一个固定公钥时,证书链才有效 它们显示的XML已断开(缺少结束标记),但在其他方面表明哈希为SHA256,编码为base64: <?xml version="1.0" encoding="utf-8"?> <network-security-config> <domai

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

通过公钥散列(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>

example.com
7HIpactkIAq2Y49orFOOQKurWxmmSFZhBCoQYcRhJ3Y=
fwza0LRMXouZHRC8Ei+4YULDPDCF3UKGO/04cDM1oE=
我们如何创建这样的散列

我在中尝试了这种方法,但是
opensslx509-inform der-pubkey-noout
不喜欢我的CRT文件。我无法轻易确定问题是否存在于CRT文件、说明、我的
openssl版本
或其他内容中


有人知道创建此哈希的好方法吗?

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


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

要为已经运行的主机设置Android网络安全配置锁定,我更喜欢
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 stackoverflow.com对于需要锁定整个证书链的任何人,这些是我在安装了Anaconda的Windows 10计算机上采取的步骤

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

  • 双击该文件。这将启动windows certmgr

  • 单击证书后,现在应该可以看到证书链条目

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

  • 选择DER编码(.CER)

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

  • 启动蟒蛇提示

  • 现在为每个文件运行@Alex Klyubin/@Gal Rom(上图)优秀的命令

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

  • 对于生成的每个文件。输出将是所需的sha256


  • 希望这对别人有帮助。我被困在试图提取整个链条的过程中。我确信有更好的方法可以做到这一点,但它已经奏效了。

    我只想补充一点,上面的oneliner假设
    cert.crt
    是PEM格式的。如果您有证书的DER格式,您可以执行
    cat cert.DER | openssl dgst-sha256-binary | openssl enc-base64
    ,而无需进行双重转换。完美的工作方式,在我的情况下,它是DER格式的,因此正如您建议的那样,我添加了-inform DER。这是我用来生成正确值的命令:
    openssl x509-inform DER-in the certificate.cer-pubkey-noout | openssl pkey-pubin-outform DER | openssl dgst-sha256-binary | openssl enc-base64
    您好,您能告诉我在哪里需要保存证书文件以执行此命令@galromthanker,事实上更容易!如果您希望pin没有另一个(在本例中)不感兴趣的混乱:
    gnutls cli YOUR_PINNING_DOMAIN_HERE 2>/dev/null | grep-A 1“公钥pin”
    是否有任何验证?我没有指纹。