OpenSSL椭圆曲线读取DER形式的私钥

OpenSSL椭圆曲线读取DER形式的私钥,openssl,Openssl,我有一个DER形式的EC私钥,我想转换成PEM形式。但是我看不懂表格 私钥生成为: openssl ecparam -param_enc named_curve -check -name "-secp384r1" -genkey -noout -out "params.pem" -outform pem openssl pkcs8 -in "params.pem" -inform pem -topk8 -nocrypt -out &qu

我有一个DER形式的EC私钥,我想转换成PEM形式。但是我看不懂表格

私钥生成为:

openssl ecparam -param_enc named_curve -check -name "-secp384r1" -genkey -noout -out "params.pem" -outform pem
openssl pkcs8 -in "params.pem" -inform pem -topk8 -nocrypt -out "private.der" -outform der
如果我尝试用

openssl ec -in private.der -inform der 
我得到一个错误:

read EC key
unable to load Key
4674530924:error:0DFFF0A8:asn1 encoding routines:CRYPTO_internal:wrong tag:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/asn1/tasn_dec.c:1144:
4674530924:error:0DFFF03A:asn1 encoding routines:CRYPTO_internal:nested asn1 error:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/asn1/tasn_dec.c:717:
4674530924:error:0DFFF03A:asn1 encoding routines:CRYPTO_internal:nested asn1 error:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/asn1/tasn_dec.c:646:Field=privateKey, Type=EC_PRIVATEKEY
4674530924:error:10FFF010:elliptic curve routines:CRYPTO_internal:EC lib:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/ec/ec_asn1.c:1353:
如果我尝试:

openssl pkcs8 -in private.der -inform der
然后我得到这些错误:

Error reading key
4460752492:error:0DFFF0A8:asn1 encoding routines:CRYPTO_internal:wrong tag:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/asn1/tasn_dec.c:1144:
4460752492:error:0DFFF03A:asn1 encoding routines:CRYPTO_internal:nested asn1 error:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/asn1/tasn_dec.c:317:Type=X509_ALGOR
4460752492:error:0DFFF03A:asn1 encoding routines:CRYPTO_internal:nested asn1 error:/AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-47.140.1/libressl-2.8/crypto/asn1/tasn_dec.c:646:Field=algor, Type=X509_SIG
请注意,如果我直接以PEM格式生成:

openssl pkcs8 -in "params.pem" -inform pem -topk8 -nocrypt -out "private.pem" -outform pem
那么,我在阅读时没有问题:

openssl ec -in private.pem -inform pem
这项研究揭示了你观察到的行为。它提到

OpenSSL使用“第1节:椭圆曲线密码术”(SEC 1:Elicific Curve Cryptography)中指定的私钥格式。要将OpenSSL EC私钥转换为PKCS#8私钥格式,请使用pkcs8命令

您已使用这些命令生成PKCS#8格式的密钥,但随后尝试使用
openssl ec
工具将其作为另一种(第1节)格式读取。预计这将失败。您应该使用以下选项:

$ openssl pkey -inform DER -in private.der 
-----BEGIN PRIVATE KEY-----
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCY6UCzQ6eDGo83UyWc
rCQw4caWF9Ttz/crt0/ba1AwQbJqSIHZIP+7f9HZdSY/VsOhZANiAATYTEaeRFGN
R6/LlKtEDzPHqIK6xr4Qp4Iz+t/ZXLccL3gdedDmtuSUbPiwj8/QI+gpW9MslkYf
c/Rm6OQpn4P1IagR98B+qSNW47olBlzzLP/k/Zqz71x9mgyQrBhYZWw=
-----END PRIVATE KEY-----
然而,
openssl ec
显然成功读取了PEM编码的PKCS#8密钥,正如您在下面提到的,那么我阅读它没有问题。。。。问题/惊喜不在于:“为什么
openssl ec
不能读取作为DER的私钥?”而是:“为什么
openssl ec
能够读取作为PEM的私钥?”答案在同一手册页中:

PEM表单是默认格式:它由DER格式base64组成,用额外的页眉和页脚行编码。对于私钥PKCS,也接受8格式


如果您想更深入地挖掘,可以从中开始,遵循源代码。它显示了在DER和PEM read bio ECPrivateKey()的情况下使用
d2i_ECPrivateKey_bio()
读取密钥对于PEM,前者是一个简单的反序列化函数。后者包含更多的智能,如中所述:

read函数透明地处理传统和PKCS#8格式的加密和未加密密钥

这里的“传统”指的是前面提到的第1节格式。

该格式对您所观察到的行为有所启发。它提到

OpenSSL使用“第1节:椭圆曲线密码术”()中指定的私钥格式。要将OpenSSL EC私钥转换为PKCS#8私钥格式,请使用pkcs8命令

您已使用这些命令生成PKCS#8格式的密钥,但随后尝试使用
openssl ec
工具将它们作为另一种(第1节)格式读入。这可能会失败。您应该使用以下方法:

$ openssl pkey -inform DER -in private.der 
-----BEGIN PRIVATE KEY-----
MIG2AgEAMBAGByqGSM49AgEGBSuBBAAiBIGeMIGbAgEBBDCY6UCzQ6eDGo83UyWc
rCQw4caWF9Ttz/crt0/ba1AwQbJqSIHZIP+7f9HZdSY/VsOhZANiAATYTEaeRFGN
R6/LlKtEDzPHqIK6xr4Qp4Iz+t/ZXLccL3gdedDmtuSUbPiwj8/QI+gpW9MslkYf
c/Rm6OQpn4P1IagR98B+qSNW47olBlzzLP/k/Zqz71x9mgyQrBhYZWw=
-----END PRIVATE KEY-----
然而,
openssl ec
显然成功读取了PEM编码的PKCS#8密钥,正如您在下面提到的那样,我在阅读它时没有问题……问题/惊奇不在于:“为什么
openssl ec
无法读取作为DER的私钥?”而是:“为什么
openssl ec
能够读取作为PEM的私钥?”。答案在同一手册页中:

PEM表单是默认格式:它由DER格式base64组成,用额外的页眉和页脚行编码。对于私钥PKCS,也接受8格式


如果你想更深入地挖掘,你可以按照源代码,从。它显示了在DER情况下使用
d2i\u ECPrivateKey\u bio()
读取密钥,在PEM情况下使用
PEM\u read\u bio\u ECPrivateKey()
。前者是一个简单的反序列化函数。但后者包含更多的智慧,如中所述:

read函数透明地处理传统和PKCS#8格式的加密和未加密密钥


这里的“传统”指的是前面提到的SEC 1格式。

完全指定输入格式:
openssl pkcs8-in private.der-inform der-nocrypt
(这与编程无关,MacOS确实有LibreSSL而不是openssl,尽管这里的区别并不重要)谢谢,这也很有效。我确信我已经用-nocrypt进行了测试,但我可能是在ec命令上进行的。请完全指定输入格式:
openssl pkcs8-in private.der-inform der-nocrypt
(这与编程无关,MacOS确实有LibreSSL而不是openssl,尽管这里的区别并不重要)谢谢,这也很有效。我确信我已经用-nocrypt进行了测试,但我可能是在ec命令上测试的。谢谢你的解释!谢谢你的解释!