Загрузка закрытого ключа ECC в .NET - PullRequest
3 голосов
/ 15 мая 2019

У меня есть частный 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-----

Есть ли встроенный API в .NET или.NET Core, который может сделать это?Или есть сторонние библиотеки, которые могут это сделать и как?

1 Ответ

3 голосов
/ 15 мая 2019

.NET Core 3.0 (в настоящее время в режиме предварительного просмотра) имеет ECDsa.ImportECPrivateKey, AsymmetricAlgorithm.ImportPkcs8PrivateKey и AsymmetricAlgorithm.ImportEncryptedPkcs8PrivateKey, (а у RSA есть RSAPublicKey и RSAPrivateKey), а для текущего файла (BEGIN EC PRIVATE KEY) вам понадобится первый один.

  • Хорошая новость этих методов: они существуют.
  • Плохие новости: они являются частью следующей версии, а не текущей.
  • Хорошо: следующая версия скоро станет текущей.
  • Плохо: они понимают только данные BER / DER, а не PEM.

Последний пункт означает, что в настоящее время вам нужно будет найти содержимое base64 между -----BEGIN EC PRIVATE KEY-----\n и \n-----END EC PRIVATE KEY----- и de-base64-it, а затем передать его в методы.


Единственные известные мне форматы закрытых ключей, которые поддерживаются импортом CNG, - это PKCS8, зашифрованные PKCS8 и частные форматы CNG. Чтобы использовать CngKey.Import, сначала необходимо преобразовать файл ключа в PKCS # 8, а затем указать, что формат Pkcs8PrivateBlob, как предлагается в комментариях.

...