11

これは簡単だと思いましたが、そうではないようです。エクスポート可能な秘密鍵を持つ証明書をインストールしていますが、プログラムで公開鍵のみを使用してエクスポートしたいと考えています。つまり、certmgrを介してエクスポートして.CERにエクスポートするときに、「秘密鍵をエクスポートしない」を選択した場合と同等の結果が必要です。

すべてのX509Certificate2.Exportメソッドは、秘密鍵が存在する場合、PKCS#12としてエクスポートするようです。これは、私が望むものとは逆です。

これを実現するためにC#を使用する方法はありますか、それともCAPICOMを掘り下げる必要がありますか?

4

3 に答える 3

20

これにつまずいたかもしれない他の誰かのために、私はそれを理解しました。X509ContentType.Cert最初の(そして唯一の)パラメータとしてを指定するとX509Certificate.Export、公開鍵のみがエクスポートされます。一方、X509ContentType.Pfx秘密鍵が存在する場合は、その秘密鍵を指定すると含まれます。

先週は別の動作が見られたと誓ったかもしれませんが、テスト時に秘密鍵がすでにインストールされていたに違いありません。今日その証明書を削除して最初からやり直したところ、エクスポートされた証明書に秘密鍵がないことがわかりました。

于 2009-05-26T19:03:06.250 に答える
10

RawData次のプログラムは、証明書のプロパティに公開鍵のみが含まれていること(MSDNはこれについては不明です)、およびX509ContentType.Certvs.に関する上記の回答X509ContentType.Pfxが期待どおりに機能することを確認するのに役立ちました。

using System;
using System.Linq;
using System.IdentityModel.Tokens;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main( string[] args )
    {
        var certPath = @"C:\blah\somecert.pfx";
        var certPassword = "somepassword";

        var orig = new X509Certificate2( certPath, certPassword, X509KeyStorageFlags.Exportable );
        Console.WriteLine( "Orig   : RawData.Length = {0}, HasPrivateKey = {1}", orig.RawData.Length, orig.HasPrivateKey );

        var certBytes = orig.Export( X509ContentType.Cert );
        var certA = new X509Certificate2( certBytes );
        Console.WriteLine( "cert A : RawData.Length = {0}, HasPrivateKey = {1}, certBytes.Length = {2}", certA.RawData.Length, certA.HasPrivateKey, certBytes.Length );

        // NOTE that this the only place the byte count differs from the others
        certBytes = orig.Export( X509ContentType.Pfx );
        var certB = new X509Certificate2( certBytes );
        Console.WriteLine( "cert B : RawData.Length = {0}, HasPrivateKey = {1}, certBytes.Length = {2}", certB.RawData.Length, certB.HasPrivateKey, certBytes.Length );

        var keyIdentifier = ( new X509SecurityToken( orig ) ).CreateKeyIdentifierClause<X509RawDataKeyIdentifierClause>();
        certBytes = keyIdentifier.GetX509RawData();
        var certC = new X509Certificate2( certBytes );
        Console.WriteLine( "cert C : RawData.Length = {0}, HasPrivateKey = {1}, certBytes.Length = {2}", certC.RawData.Length, certC.HasPrivateKey, certBytes.Length );

        Console.WriteLine( "RawData equals original RawData: {0}", certC.RawData.SequenceEqual( orig.RawData ) );

        Console.ReadLine();
    }
}

以下を出力します。

元の:RawData.Length = 1337、HasPrivateKey = True
証明書A:RawData.Length = 1337、HasPrivateKey = False、certBytes.Length = 1337
証明書B:RawData.Length = 1337、HasPrivateKey = True、certBytes.Length = 3187
証明書C:RawData.Length = 1337、HasPrivateKey = False、certBytes.Length = 1337
RawDataは元のRawDataと等しい:True
于 2015-04-07T02:10:00.713 に答える
1

便利なOpenSSL.NETラッパーがあります。

于 2009-05-21T16:29:28.117 に答える