我们如何为 Android N 证书固定生成 X.509 证书的 SubjectPublicKeyInfo 的 Base64 编码的 SHA256 哈希值?
How Do We Generate a Base64-Encoded SHA256 Hash of SubjectPublicKeyInfo of an X.509 Certificate, for Android N Certificate Pinning?
N Developer Preview 中有关其网络安全配置的文档提供了以下说明:
Certificate pinning is done by providing a set of certificates by hash of the public key (SubjectPublicKeyInfo of the X.509 certificate). A certificate chain is then only valid if the certificate chain contains at least one of the pinned public keys.
他们显示的 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
版本还是其他什么地方。
有没有人知道创建此散列的好方法?
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
添加到第一个命令。
要为已经运行的主机设置 Android network-security-config 固定,我更喜欢 gnutls-cli
(GnuTLS 客户端)。它以 sha256 可复制粘贴为 base64 编码的形式输出主机的证书信息。例如:
$ gnutls-cli whosebug.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="
对于需要固定整个证书链的任何人,这些是我在 Windows 10 机器上采取的步骤,幸运的是安装了 Anaconda。
从 Chrome 或 Edge 保存证书文件。选择另存为 (.P7B) 的选项并确保选中“包括所有证书..”
双击文件。这应该启动 windows certmgr.
单击“证书”后,您现在应该会看到证书链条目
右键单击每个证书链条目。选择所有任务并导出。
选择 DER 编码 (.CER)
对每个重复(注意层次结构)
启动 Anaconda 提示。
现在 运行 @Alex Klyubin / @Gal Rom(以上)每个文件的优秀命令。
openssl x509 -inform DER -in prod_root.cer -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -二进制 | openssl enc -base64
对于每个生成的文件。输出将是所需的 sha256
希望这对某人有所帮助。我在尝试提取整个链时非常困难。我相信有更好的方法可以做到这一点,但它确实奏效了。
用这个获取在线https的base64 sha256 url:
openssl s_client -connect google.com:443 < /dev/null 2>/dev/null | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
N Developer Preview 中有关其网络安全配置的文档提供了以下说明:
Certificate pinning is done by providing a set of certificates by hash of the public key (SubjectPublicKeyInfo of the X.509 certificate). A certificate chain is then only valid if the certificate chain contains at least one of the pinned public keys.
他们显示的 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
版本还是其他什么地方。
有没有人知道创建此散列的好方法?
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
添加到第一个命令。
要为已经运行的主机设置 Android network-security-config 固定,我更喜欢 gnutls-cli
(GnuTLS 客户端)。它以 sha256 可复制粘贴为 base64 编码的形式输出主机的证书信息。例如:
$ gnutls-cli whosebug.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="
对于需要固定整个证书链的任何人,这些是我在 Windows 10 机器上采取的步骤,幸运的是安装了 Anaconda。
从 Chrome 或 Edge 保存证书文件。选择另存为 (.P7B) 的选项并确保选中“包括所有证书..”
双击文件。这应该启动 windows certmgr.
单击“证书”后,您现在应该会看到证书链条目
右键单击每个证书链条目。选择所有任务并导出。
选择 DER 编码 (.CER)
对每个重复(注意层次结构)
启动 Anaconda 提示。
现在 运行 @Alex Klyubin / @Gal Rom(以上)每个文件的优秀命令。
openssl x509 -inform DER -in prod_root.cer -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -二进制 | openssl enc -base64
对于每个生成的文件。输出将是所需的 sha256
希望这对某人有所帮助。我在尝试提取整个链时非常困难。我相信有更好的方法可以做到这一点,但它确实奏效了。
用这个获取在线https的base64 sha256 url:
openssl s_client -connect google.com:443 < /dev/null 2>/dev/null | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64