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