2016-11-07 4 views
0

У меня есть простое консольное приложение C# DotNet, которое перечисляет сертификаты в месте/хранилище. Он показывает такие вещи, как следующее:Как определить, доступен ли сертификат X.509?

  • x509.SerialNumber
  • x509.Issuer
  • x509.Subject
  • x509.HasPrivateKey

Есть ли какое-то свойство, которое покажет, является ли сертификат экспортируется? Я не мог найти его, но я довольно новичок в этом.

ответ

1

Там не надежный способ сделать это, потому что вы должны пересечь границу от «осуществления независимой» в «в зависимости от реализации» - - экспортность не присуща сертификатам или ключам, а функция сохранения ключа.

Если вы только на Windows, и вы на Windows XP или старше, это будет работать достаточно надежно:

try 
{ 
    ICspAsymmetricAlgorithm key = cert.PrivateKey; 

    if (key != null) 
    { 
     return key.CspKeyContainerInfo.Exportable; 
    } 
} 
catch (CryptographicException) {} 

return whateverYouWantUnknownToBe; 

После того, как вы на Vista, или более поздней версии, то это возможно, чтобы получить сертификаты, где это HasPrivateKey - это правда, но PrivateKey выбрасывает исключение «недействительного провайдера», чтобы обойти это, вам нужно перейти на .NET 4.6.

// AllowExport says whether it can be exported in a PFX (encrypted key) 
// AllowPlainTextExport says whether it can be exported as (e.g.) an RSAParameters structure 
const CngExportPolicies RequiredPolicies = CngExportPolicies.AllowExport; 

RSACng rsaCng = cert.GetRSAPrivateKey() as RSACng; 

if (rsaCng != null) 
{ 
    return (rsaCng.Key.ExportPolicy & RequiredPolicies) == RequiredPolicies; 
} 

// Requires 4.6.1 
ECDsaCng ecdsaCng = cert.GetECDsaPrivateKey() as ECDsaCng; 

if (ecdsaCng != null) 
{ 
    return (ecdsaCng.Key.ExportPolicy & RequiredPolicies) == RequiredPolicies; 
} 

// Requires 4.6.2 
DSACng dsaCng = cert.GetDSAPrivateKey() as DSACng; 

if (dsaCng != null) 
{ 
    return (dsaCng.Key.ExportPolicy & RequiredPolicies) == RequiredPolicies; 
} 

// previous code goes here. 

Но, в конечном счете, единственным надежным способом является попытка его попробовать.

1

Если это сертификат RSA вы могли бы сделать что-то вроде этого:

RSACryptoServiceProvider rsa = cert.PrivateKey; 
var isExportable = rsa.CspKeyContainerInfo.Exportable; 

 Смежные вопросы

  • Нет связанных вопросов^_^