Загрузите сертификат, используя X509Certificate2 с открытым ключом ECC

Это вопрос новичка. Я пытаюсь загрузить сертификат .der, используя:

X509Certificate2 cert = new X509Certificate2(@"c:\temp\mycert.der");
RSACryptoServiceProvider csp = (RSACryptoServiceProvider)cert.PublicKey.Key

Но я получаю ошибку «Алгоритм ключа сертификата не поддерживается» во 2-й строке. Когда я импортирую этот сертификат в MMC, я вижу открытый ключ, например this.

Это действительно? Как мне получить это в коде?


person notlkk    schedule 30.09.2015    source источник
comment
Открытый ключ для ECC имеет другую структуру, чем ключ RSA, но окна не отображают его должным образом. Я бы использовал надувной замок, чтобы получить открытый ключ.   -  person pepo    schedule 01.10.2015
comment
@pepo, на самом деле, это не совсем правильное утверждение о ECC. Windows поддерживает и корректно отображает открытые ключи ECC. Проблема связана с кривой, используемой в этом сертификате. Windows поддерживает только часть кривых ECC, а эта не поддерживается.   -  person Crypt32    schedule 01.10.2015


Ответы (1)


До .NET 4.6.1 ключи ECDSA не поддерживались. По соображениям совместимости/наследия (например, в вашем образце здесь, где вы конвертируете в RSACryptoServiceProvider) свойство PublicKey.Key и свойство X509Certificate2.PrivateKey по-прежнему не могут использовать ECDSA. Вместо этого есть новый, более безопасный путь:

using (ECDsa ecdsa = cert.GetECDsaPublicKey())
{
    if (ecdsa != null)
    {
        // I had to do something with it in this example...
        bool verified = ecdsa.VerifyData(data, signature, HashAlgorithmName.SHA256);
    }
}
person bartonjs    schedule 07.07.2016