を使用すると、「実装依存」への「実装に依存しない」から境界を横断しなければならないので、それを行うための信頼できる方法はありません - - エクスポート機能は、証明書や鍵に固有のものではなく、鍵の格納方法の機能です。
あなたがWindows上だけだ、とあなたは、Windows XPまたはそれ以前を使っているのであれば、これはかなり確実に動作します:
try
{
ICspAsymmetricAlgorithm key = cert.PrivateKey;
if (key != null)
{
return key.CspKeyContainerInfo.Exportable;
}
}
catch (CryptographicException) {}
return whateverYouWantUnknownToBe;
あなたがVista上またはそれ以降できたら、それはどこの証明書を取得することが可能ですHasPrivateKey
はtrueですが、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.
しかし、究極的には、究極的には、実際にはそれを試してみることです。