2017-07-24 3 views
1

I généré 3 clés/certificats à l'aide de ce script:Décrypter certificat OpenSSL

#!/bin/sh 
AUTH='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]' 
if [ "$1" == "" ]; then 
     echo "Create a test certificate key." 
     echo "Usage: $0 NAME" 
     echo "Will generate NAME.pk8 and NAME.x509.pem" 
     echo " $AUTH" 
     exit 
fi 

openssl genrsa -3 -out $1.pem 2048 

openssl req -new -x509 -key $1.pem -out $1.x509.pem -days 10000 \ 
    -subj "$AUTH" 

echo "Please enter the password for this key:" 
openssl pkcs8 -in $1.pem -topk8 -outform DER -out $1.pk8 -passout stdin 

La sortie est:

releasekey.pem 
releasekey.pk8 
releasekey.x509.pem 

Je suis en train de le décrypter en utilisant cette commande:

openssl pkcs8 -in ~/.android-certs/releasekey.pk8 -inform DER 

Ainsi, la sortie est

alex-garmas-osx:android alex-garmash$ openssl pkcs8 -in ~/.android- 

certs/releasekey.pk8 -inform DER 
Enter Password: 
-----BEGIN PRIVATE KEY----- 
CONTENT OF PRIVATE KEY HERE 
-----END PRIVATE KEY----- 

Et cela fonctionne bien. releasekey.pk8 ne dispose pas d'un mot de passe

Quand je fais la même chose avec la commande:

openssl pkcs8 -in ~/.android-certs/releasekey.pk8 -inform DER -nocrypt 

je une erreur:

140735885419528:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1200: 
140735885419528:error:0D06C03A:asn1 encoding routines:ASN1_D2I_EX_PRIMITIVE:nested asn1 error:tasn_dec.c:768: 
140735885419528:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:tasn_dec.c:700:Field=version, Type=PKCS8_PRIV_KEY_INFO 

Dans le documentation je vois que je peux utiliser l'option -nocrypt , mais pourquoi échoue-t-il?

MISE À JOUR

Un grand merci à @bartonjs pour l'explication. Pour résoudre ce problème, vous devez ajouter -nocrypt drapeau à la dernière commande du script, vous pouvez utiliser la commande ci-dessus pour décrypter la clé générée

#!/bin/sh 
AUTH='/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/[email protected]' 
if [ "$1" == "" ]; then 
     echo "Create a test certificate key." 
     echo "Usage: $0 NAME" 
     echo "Will generate NAME.pk8 and NAME.x509.pem" 
     echo " $AUTH" 
     exit 
fi 

openssl genrsa -3 -out $1.pem 2048 

openssl req -new -x509 -key $1.pem -out $1.x509.pem -days 10000 \ 
    -subj "$AUTH" 

echo "Please enter the password for this key:" 
openssl pkcs8 -in $1.pem -topk8 -outform DER -out $1.pk8 -passout stdin -nocrypt 
+0

De la documentation '-nocrypt' _Avec cette option, une structure PrivateKeyInfo non cryptée est attendue ou output._ mais' releasekey.pk8' est cryptée avec un mot de passe. n'est-ce pas? – pedrofb

+1

@pedrofb sans. J'ai écrit ci-dessus: "releasekey.pk8 n'a pas de mot de passe" passphrase = mot de passe. Il est vide – Alexander

Répondre

2

vous obtenez demandé le mot de passe vide, et réussit, et avec -nocrypt il échoue.

Il y a une différence entre "crypté avec le mot de passe vide" et "non crypté" (mais pour un crypteur brut, pas beaucoup d'un).

Un PKCS # 8 non crypté blob ressemble (ASN.1):

PrivateKeyInfo ::= SEQUENCE { 
    version     Version, 
    privateKeyAlgorithm  PrivateKeyAlgorithmIdentifier, 
    privateKey    PrivateKey, 
    attributes   [0] IMPLICIT Attributes OPTIONAL } 

S'il a été chiffré, il est

EncryptedPrivateKeyInfo ::= SEQUENCE { 
    encryptionAlgorithm EncryptionAlgorithmIdentifier, 
    encryptedData  EncryptedData } 

EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier 

EncryptedData ::= OCTET STRING 

Alors -nocrypt dit OpenSSL qu'il devrait attendre le premier structure directement, alors que la vôtre ressemble à la seconde (notamment, le premier enfant de la SEQUENCE n'était pas un INTEGER, mais une autre SEQUENCE). Et dire que vos données ont été cryptées avec le mot de passe vide ne signifie pas qu'il a été crypté avec une sorte de clé vide. Le créateur du fichier PKCS # 8 a presque certainement eu du mal à choisir un sel aléatoire pour l'algorithme PBKDF2, qui est ensuite combiné avec le mot de passe vide pour produire une sortie. Ces données sont encore du bruit, juste ... plus facile à bruger que le bruit normal.

+0

merci beaucoup – Alexander