23

ローカルマシンの証明書ストアにX509証明書(pfx / PKCS#12)をプログラムでインポートしようとしています。この特定の証明書には一連の証明書があり、証明書パスは次のようになります。

  • ルート証明書CA
    • 組織証明書CA
      • 組織2証明書CA
        • 私の証明書

私が使用するコードは次のようになります。

cert = new X509Certificate2(pathToCert, password);

if (cert != null)
{
    var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
    store.Open(OpenFlags.ReadWrite);
    if (!store.Certificates.Contains(cert))
    {
        store.Add(cert);
    }
}

このコードは証明書をインポートしますが、チェーンを無視しているようです。ストアで証明書を確認すると、証明書パスには次の情報しか表示されません。

  • 私の証明書

ただし、pfxを手動でインポートすると、フルパスが表示されます。ここで手順をスキップしますか、それともいくつかのパラメーターがありませんか?誰かがこれに光を当てることができますか?

4

4 に答える 4

20

PFXファイルをX509Certificate2Collectionオブジェクトとして開くことにより、PFX内の証明書を反復処理できるはずです(そして、それぞれを選択した証明書ストアにインポートできます)。

X509Certificate2Collectionのドキュメントは次のとおりです。

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate2collection.aspx

MSDNは、コレクション内の各証明書を検査する方法について、そのドキュメントページにいくつかのサンプルコードを提供しています。

各証明書に関するCN/発行者/その他の情報がわかれば、それぞれを追加する必要のある証明書ストアを明確にする必要があります。そのためには、X509StoreクラスとStoreName列挙を使用して、開く/追加するストアを指定できます。

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509store.aspx

http://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.storename.aspx

同様のSOの質問に対する私の回答も参照してください。

c#でpfxファイルから証明書を取得する方法は?

その回答に関する最新のコメントの1つで述べたように、現在のユーザーのルートストア(名前/場所として「StoreName.Root」と「StoreLocation.CurrentUser」)に証明書をインポートしようとすると、ポップアップダイアログが表示されます。確認します。

これを解決するために、証明書のインポートメソッドにMS UIオートメーションコードを少し追加して、プロンプトで[OK]をクリックします。

または、コメント投稿者「CodeWarrior」が他のSO回答のコメントで述べているように、ポップアップダイアログを回避するには、CurrentUserではなくLocalMachineストアにルート証明書を配置してみてください。

サンプルコード:

string certPath = <YOUR PFX FILE PATH>;
string certPass = <YOUR PASSWORD>;

// Create a collection object and populate it using the PFX file
X509Certificate2Collection collection = new X509Certificate2Collection();
collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet);

foreach (X509Certificate2 cert in collection)
{
    Console.WriteLine("Subject is: '{0}'", cert.Subject);
    Console.WriteLine("Issuer is:  '{0}'", cert.Issuer);

    // Import the certificate into an X509Store object
}
于 2012-02-05T20:43:47.847 に答える
9

将来の参考のために、X509Chainオブジェクトを使用してこれを行う別の方法を発見しました。

var cert = new X509Certificate2(pathToCert, password);

X509Chain chain = new X509Chain();
chain.Build(cert);
for (int i = 0; i < chain.ChainElements.Count; i++)
{
   //add to the appropriate store
}
于 2012-02-13T12:40:36.800 に答える
1

「適切なストアへ」のコードジェネリックソリューションが必要な場合

これは私がVBを使用して作成したものなので、C#に移植するのは難しいことではありません。私は上記の投稿を使って始めました。私はこれで完全なNooBです。

    Dim certPath = "C:\Users\08353153\Documents\Visual Studio 2015\Projects\WindowsApplication2\WindowsApplication2\bin\Debug\8870-thebigchess.pfx"
    Dim certPass = "eduSTAR.NET"
    Dim Collection As New X509Certificate2Collection
    Collection.Import(certPath, certPass, X509KeyStorageFlags.PersistKeySet)

    Dim certOne As X509Certificate2 = Collection(0)
    Dim certTwo As X509Certificate2 = Collection(2)
    Dim certThree As X509Certificate2 = Collection(1)

    Dim personal As New X509Store(StoreName.My, StoreLocation.LocalMachine)
    personal.Open(OpenFlags.ReadWrite)
    personal.Add(certOne)
    personal.Close()

    Dim trust As New X509Store(StoreName.Root, StoreLocation.LocalMachine)
    trust.Open(OpenFlags.ReadWrite)
    trust.Add(certTwo)
    trust.Close()

    Dim intermed As New X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine)
    intermed.Open(OpenFlags.ReadWrite)
    intermed.Add(certThree)
    intermed.Close()
于 2016-01-08T04:55:43.877 に答える
-1

X.509証明書には、ルート証明書(中間機関を含む)にリンクするチェーンのみが含まれていますが、これらの証明書は証明書に含まれていません。このチェーンは、(自己署名されていない)終了証明書が検証されるときに使用されます。信頼できるルート証明書につながる必要があります。より正確には、各CAの公開鍵を使用して、発行された証明書のハッシュをデコードおよび検証します。このプロセスは、ルート証明書に到達するまで繰り返されます。チェーン全体がチェックされた後、ルート証明書が信頼されている場合、エンド証明書も信頼されます。もちろん、このプロセスには他の検証(開始日、終了日、証明書失効リストなど)も含まれますが、チェーンの使用法に関連する部分のみを詳しく説明しました。

したがって、「マイ証明書」をチェーンと一緒に「ルート証明書CA」に正しくインポートしました。このチェーンは「マイ証明書」にエンコードされており、プロパティを表示して確認できますが、このチェーンはリンクにすぎず、リンクではありません。 「ルート証明書CA」、「組織証明書CA」、および「組織2証明書CA」のいずれかの証明書が含まれています。

これで問題が解決することを願っていますが、解決しない場合は、何を達成しようとしているのか、具体的に教えてください。

于 2012-02-04T14:53:06.957 に答える