【发布时间】:2019-10-02 07:33:33
【问题描述】:
我有一个 ECC 私有和一个包含公钥的证书文件。我可以以 PEM 或 DER 格式获取它们。
我可以使用以下代码将证书读入X509Certificate:
var certbytes = File.ReadAllBytes("certificate.pem");
var cert = new X509Certificate2(certbytes);
但我无法加载私钥。我试过这段代码:
var keyContent = File.ReadAllBytes("certificate_private_key.pem");
var key = CngKey.Import(keyContent, CngKeyBlobFormat.EccPrivateBlob);
它抛出Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'An error occurred during encode or decode operation'。
我还尝试了CngKeyBlobFormat 参数的其他值。 Import 方法也会失败。
openssl 可以读取该文件,并输出有关该文件的以下信息:
openssl ec -in certificate_private_key.pem -text
read EC key
Private-Key: (256 bit)
priv:
44:<cut>:68
pub:
04:<cut>:13
ASN1 OID: prime256v1
NIST CURVE: P-256
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHcC <cut here>
-----END EC PRIVATE KEY-----
.NET 或 .NET Core 中是否有内置 API 可以做到这一点?或者是否有第三方库可以做到这一点,以及如何做到这一点?
【问题讨论】:
-
感谢您的提示。
openssl pkcs8看不懂文件,只能openssl ec。我已经拥有 DER 和 PEM 格式的文件,但都不起作用。根据CngKeyBlobFormat参数,异常是An error occurred during encode or decode operation或The parameter is incorrect。我也试过用openssl ec -in certificate_private_key.der -inform DER -param_enc explicit -out explicit.der -outform der将DER文件转换为显式EC文件,并使用CngKeyBlobFormat.EccFullPrivateBlob作为格式,但导入时仍然失败。 -
啊,在那种情况下它是 X9.62 格式。真的应该从
-----BEGIN EC PRIVATE KEY-----标头中看到这一点。 X9.62 私钥是在 PKCS#8 文件中的内容。 -
试试
openssl pkcs8 -topk8 -nocrypt -in oldfile.pem -out newfile.pem- 我猜-outform DER可能也可以。 -
运气好吗?首先转换为二进制 PKCS#8 格式,然后使用
Pkcs8PrivateBlob应该真的可以工作。 -
是的,这行得通。 (抱歉回复晚了——其他工作和睡眠妨碍了)。现在可以使用
var privatekey = File.ReadAllBytes("newfile.der"); var privkey = CngKey.Import(privatekey, CngKeyBlobFormat.Pkcs8PrivateBlob); var privkeyecdsa = new ECDsaCng(privkey);读取 DER 文件
标签: c# cryptography x509certificate2