web-dev-qa-db-fra.com

Comment générer un hachage SHA256 codé en Base64 de SubjectPublicKeyInfo d'un certificat X.509, pour Android N Épinglage de certificat?

La documentation dans N Developer Preview pour leur configuration de sécurité réseau propose ces instructions:

L'épinglage des certificats se fait en fournissant un ensemble de certificats par hachage de la clé publique (SubjectPublicKeyInfo du certificat X.509). Une chaîne de certificats n'est alors valide que si la chaîne de certificats contient au moins une des clés publiques épinglées.

Le XML qu'ils montrent est cassé (il manque une balise de fermeture), mais suggère autrement que le hachage est SHA256 et codé en 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>

Comment créer un tel hachage?

J'ai essayé l'approche dans ce Gist , mais openssl x509 -inform der -pubkey -noout n'aime pas mon fichier CRT. Je ne peux pas déterminer facilement si le problème se trouve dans le fichier CRT, les instructions, ma version de openssl ou autre chose.

Quelqu'un a-t-il une bonne recette connue pour créer ce hachage?

22
CommonsWare

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

Vous devrez peut-être ajouter -inform der à la première commande si cert.crt est sous forme DER plutôt que sous forme PEM.

61
Alex Klyubin

Pour configurer Android épinglage de la sécurité du réseau pour un hôte déjà en ligne, je préfère gnutls-cli (Client GnuTLS). Il produit les informations de certificat d'un hôte sous une forme où le sha256 est copiable et collable en tant que codé en base64. Par exemple:

$ 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