我们如何为Android N证书固定生成X.509证书的SubjectPublicKeyInfo的Base64编码SHA256哈希?
N Developer预览版中有关其网络安全配置的文档提供了以下说明: 通过公钥散列(X.509证书的SubjectPublicKeyInfo)提供一组证书来完成证书固定。只有当证书链包含至少一个固定公钥时,证书链才有效 它们显示的XML已断开(缺少结束标记),但在其他方面表明哈希为SHA256,编码为base64:我们如何为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
<?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”
是否有任何验证?我没有指纹。