解密OpenSSL的证书
问题描述:
我产生3个密钥/证书使用这个脚本:解密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
输出是:
releasekey.pem
releasekey.pk8
releasekey.x509.pem
然后我尝试使用此命令解密:
openssl pkcs8 -in ~/.android-certs/releasekey.pk8 -inform DER
所以,输出是
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-----
它的工作正常。 releasekey.pk8
没有一个密码
当我做的命令是一样的:
openssl pkcs8 -in ~/.android-certs/releasekey.pk8 -inform DER -nocrypt
我有一个错误:
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
在documentation我看到,我可以使用选项-nocrypt
,但它为什么失败?
UPDATE
非常感谢@bartonjs的解释。为了解决这个问题,你需要-nocrypt标志添加到脚本的最后一个命令,那么你可以使用
#!/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
答
你得到提示为空口令上述解密生成的密钥的命令,它成功,并与-nocrypt
它是失败的。
“使用空密码加密”和“未加密”(虽然对于一个蛮力forcer,没有太多)之间有区别。
未加密PKCS#8斑点看起来像(ASN.1):
PrivateKeyInfo ::= SEQUENCE {
version Version,
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier,
privateKey PrivateKey,
attributes [0] IMPLICIT Attributes OPTIONAL }
如果它已被加密,那么它的
EncryptedPrivateKeyInfo ::= SEQUENCE {
encryptionAlgorithm EncryptionAlgorithmIdentifier,
encryptedData EncryptedData }
EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
EncryptedData ::= OCTET STRING
所以-nocrypt
告诉OpenSSL的,它应该期望第一结构直接,而你的看起来像第二个(特别是,SEQUENCE的第一个孩子不是INTEGER,而是另一个SEQUENCE)。
而且说你的数据是用空密码加密的,并不意味着它是用某种空密钥加密的。 PKCS#8文件的创建者几乎肯定经历了向PBKDF2算法中挑选随机盐的麻烦,然后将其与空密码结合以产生输出。这些数据仍然是噪音,只是......比平常更容易受到强力噪音的影响。
+0
非常感谢你 – Alexander
从文档'-nocrypt' _使用此选项预期或输出未加密的PrivateKeyInfo结构._但releasekey.pk8'用密码加密。不是吗? – pedrofb
@pedrofb无。我在上面写道:“releasekey.pk8没有密码”passphrase =密码。这是空的 – Alexander