2016-03-22 6 views
6

Die Dokumentation in der N Developer Preview für ihre Netzwerk-Sicherheitskonfiguration bietet diese Anweisungen:Wie generieren wir einen Base64-codierten SHA256-Hash von SubjectPublicKeyInfo eines X.509-Zertifikats für Android N-Zertifikat-Pinning?

Zertifikat Pinning durch die Bereitstellung einer Reihe von Zertifikaten durch Hash-Wert des öffentlichen Schlüssels (SubjectPublicKeyInfo des X.509-Zertifikat) durchgeführt wird. Eine Zertifikatskette ist nur dann gültig, wenn die Zertifikatskette mindestens einen der fixierten öffentlichen Schlüssel enthält.

Die XML, die sie zeigen, gebrochen wird (ein schließendes Tag fehlt), schlägt aber vor, dass andernfalls der Hash SHA256 und codiert 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> 

Wie schaffen wir eine solche Hash?

Ich versuchte den Ansatz in this gist, aber openssl x509 -inform der -pubkey -noout ist nicht meine CRT-Datei. Ich kann nicht leicht feststellen, ob das Problem in der CRT-Datei, den Anweisungen, meiner Version openssl oder etwas anderem liegt.

Hat jemand ein bekannt gutes Rezept zum Erstellen dieses Hash?

Antwort

13

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

Sie müssen möglicherweise -inform der auf den ersten Befehl hinzufügen, wenn cert.crt in Form eher DIE ist als in PEM-Form.