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

时间:2016-03-22 19:07:03

标签: android x509certificate android-7.0-nougat

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版本或其他内容中。

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

5 个答案:

答案 0 :(得分:34)

cartItems

如果cert.crt是DER形式而不是PEM形式,您可能需要将self.grandTotal = ko.pureComputed(function () { var total = 0; var grandTotal = 0; for (var i = 0; i < self.cartItems().length; i++) { var itemPrice = parseFloat(cartItems[i].price, 10); var itemqty = parseInt(cartItems[i].qty, 10); total += itemPrice * itemqty; } grandTotal = total + (total * tax); //Add shipping cost //Discount CMEZ return grandTotal; }); 添加到第一个命令。

答案 1 :(得分:4)

要为已经存在的主机设置Android network-security-config固定,我更喜欢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="

答案 2 :(得分:0)

对于需要固定整个证书链的任何人,这些都是我在幸运地安装了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-通知DER -in prod_root.cer -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64

  9. 对于每个生成的文件。输出将达到所需的sha256

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

答案 3 :(得分:0)

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

还要在命令行中添加 openssl 路径

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

答案 4 :(得分:0)

使用它来获取在线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