在.NET

时间:2019-05-15 08:14:55

标签: c# cryptography x509certificate2

我有一个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参数的其他值。导入方法也会失败。

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可以做到这一点?还是有第三方库可以做到?

1 个答案:

答案 0 :(得分:2)

.NET Core 3.0(当前处于预览状态)具有ECDsa.ImportECPrivateKeyAsymmetricAlgorithm.ImportPkcs8PrivateKeyAsymmetricAlgorithm.ImportEncryptedPkcs8PrivateKey(并且RSA具有RSAPublicKey和RSAPrivateKey)以及当前文件({{1} })您想要第一个。

  • 这些方法的好消息是:它们存在。
  • 坏消息是:它们是下一版本的一部分,而不是当前版本。
  • 好:下一个版本应尽快为当前版本。
  • 错误:他们只了解BER / DER数据,而不了解PEM。

最后一点意味着您当前必须在BEGIN EC PRIVATE KEY-----BEGIN EC PRIVATE KEY-----\n之间找到base64内容并进行debase64-it,然后将其传递给方法。


我知道CNG导入支持的唯一私有密钥格式是PKCS8,加密的PKCS8和CNG私有格式。要使用CngKey.Import,您首先需要将密钥文件转换为PKCS#8,然后按照注释中的建议指定格式为\n-----END EC PRIVATE KEY-----

相关问题