2016-11-07 11 views
0

私は、ロケーション/ストア内の証明書を列挙する単純なC#DotNetコンソールアプリケーションを持っています。X.509証明書がエクスポート可能かどうかを確認するには?

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

証明書かどうかを教えてくれるすべてのプロパティがあります:それは、次のようなものが表示されます輸出可能ですか?私は1つを見つけることができませんでしたが、私はこれにかなり新しいです。それはRSA証明書の場合は

答えて

1

を使用すると、「実装依存」への「実装に依存しない」から境界を横断しなければならないので、それを行うための信頼できる方法はありません - - エクスポート機能は、証明書や鍵に固有のものではなく、鍵の格納方法の機能です。

あなたが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. 

しかし、究極的には、究極的には、実際にはそれを試してみることです。

1

あなたはこのような何か行うことができます:

RSACryptoServiceProvider rsa = cert.PrivateKey; 
var isExportable = rsa.CspKeyContainerInfo.Exportable; 
関連する問題