Descodificar o certificado openssl

criei 3 chaves / certificados usando este programa:

#!/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

a saída é:

releasekey.pem
releasekey.pk8
releasekey.x509.pem

então estou a tentar descodificá-lo usando este comando:

openssl pkcs8 -in ~/.android-certs/releasekey.pk8 -inform DER
Então, a saída é

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-----
E funciona bem. releasekey.pk8 não tem uma frase-senha

Quando faço o mesmo com o comando:

openssl pkcs8 -in ~/.android-certs/releasekey.pk8 -inform DER -nocrypt
Tenho um erro.
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

na Documentaçãovejo que posso usar a opção -nocrypt, mas porquê? falhando?

actualização

Muito obrigado a@bartonjs pela explicação. Para resolver este problema, terá de adicionar a opção -nocrypt ao último comando do programa, depois poderá usar o comando acima para descodificar a chave gerada

#!/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
Author: Alexander, 2017-07-24

1 answers

Estão a pedir-Lhe a senha vazia, e ela tem sucesso, e com -nocrypt está a falhar.

Há uma diferença entre" criptografado com a senha vazia "e" não criptografado " (embora para um forcer bruto, não muito de um).

Um PKCS#8 blob não encriptado parece (ASN.1):

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

Se foi encriptado, então é

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

EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier

EncryptedData ::= OCTET STRING

Então -nocrypt diz ao OpenSSL que deve esperar a primeira estrutura directamente, enquanto que a sua parece ser a segunda (notavelmente, o primeiro filho da sequência não era um inteiro, mas era outra sequência).

E dizer que os seus dados foram encriptados com a senha vazia não significa que foram encriptados com uma chave vazia. O criador do arquivo PKCS#8 quase certamente teve o trabalho de escolher um sal aleatório para o algoritmo PBKDF2, que então é combinado com a senha vazia para produzir uma saída. Esses dados ainda são ruídos... é mais fácil forçar o ruído do que o normal.
 2
Author: bartonjs, 2017-07-24 14:33:25