web-dev-qa-db-ja.com

Android N証明書のピン留めのために、X.509証明書のSubjectPublicKeyInfoのBase64エンコードSHA256ハッシュをどのように生成しますか?

ネットワーク開発者向けのN Developer Previewのドキュメントには、次の手順が記載されています。

証明書のピン留めは、公開キーのハッシュ(X.509証明書のSubjectPublicKeyInfo)によって証明書のセットを提供することによって行われます。この場合、証明書チェーンは、証明書チェーンに少なくとも1つの固定された公開鍵が含まれている場合にのみ有効です。

彼らが表示する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のバージョン、またはその他の何かにあるかどうかを簡単に判断できません。

このハッシュを作成するための既知の優れたレシピはありますか?

22
CommonsWare

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

追加する必要があるかもしれません-inform der cert.crtがPEM形式ではなくDER形式の場合、最初のコマンドに。

61
Alex Klyubin

設定済みの場合Android network-security-config pinning for a Host is already lived、I優先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="
9
laalto