none
X.509証明書のファイル保存 RRS feed

  • 質問

  • Visual Studio2008/C# で、X.509証明書をファイルに保存するプログラムを作成しています。
    RSACryptoServiceProviderで作成したキーを、X.509(PKCS#12)形式でファイルに
    保存したいのですが、MonoやOpenSSLのライブラリを使用すると実装はできそうなのですが、
    より簡易に開発したいと思っています。

    X509Certificate2、RSACryptoServiceProvider、RSAParametersクラス
    を使用して実装する方法が以下にあったのですが、

    http://stackoverflow.com/questions/2039364/how-do-i-create-a-pkcs12-p12-file-in-c

    「cert.PrivateKey = rsaKey;」
    のところで、「m_safeCertContext は無効なハンドルです」という例外が出てしまいます。
    この対処法、もしくは、ほかの実装方法があれば、お教えください。
    MonoやOpenSSLライブラリ、Makecert.exe は使用したくありません。

    2010年2月18日 3:18

回答

  • 以下方法でうまくゆきましたので、報告しておきます。

    X509Certificate2クラスのPublicKey.Keyプロパティ、PrivateKeyプロパティが、
    RSACryptoServiceProviderクラスのオブジェクトであるというところがポイントでした。

    ですので、RSACryptoServiceProviderのExportParameters、ImportParametersを使って、RSAParametersを経由して
    X509Certificate2、RSACryptoServiceProvider間の変換が行えます。

    これによって、以下が出来る様になります。

    ・RSACryptoServiceProviderで公開鍵、秘密鍵を生成→X509Certificate2に変換→X509形式のファイルを作成
    ・X509形式のファイル→X509Certificate2で読み込み→RSACryptoServiceProviderに変換→RSAの暗号化・複合を実行
    2010年2月22日 10:37

すべての返信

  • 以下方法でうまくゆきましたので、報告しておきます。

    X509Certificate2クラスのPublicKey.Keyプロパティ、PrivateKeyプロパティが、
    RSACryptoServiceProviderクラスのオブジェクトであるというところがポイントでした。

    ですので、RSACryptoServiceProviderのExportParameters、ImportParametersを使って、RSAParametersを経由して
    X509Certificate2、RSACryptoServiceProvider間の変換が行えます。

    これによって、以下が出来る様になります。

    ・RSACryptoServiceProviderで公開鍵、秘密鍵を生成→X509Certificate2に変換→X509形式のファイルを作成
    ・X509形式のファイル→X509Certificate2で読み込み→RSACryptoServiceProviderに変換→RSAの暗号化・複合を実行
    2010年2月22日 10:37
  • うまくいったと思ったのですが、NGでした。 どなたかアドバイスいただけませんでしょうか?

    具体的な流れは以下の通りです。

    (1) 初期作成用のpfxファイルを読み込んでX509Certificate2インスタンスを作成(①)
    (2) RSACryptoServiceProviderインスタンスを作成し公開鍵、秘密鍵を作成(④)
    (3) RSAParameters 経由で、(2)の公開鍵をイクスポートし(1)にインポート(⑤、⑥)
    (4) 新しいpfxファイルを出力(⑨、⑩)
    ※実際には秘密鍵のイクスポート、インポートもしますが、本スレッドでは省略しています。

    ②、③で表示される公開鍵と、⑦、⑧で表示される公開鍵を見てみると、
    ⑦で見た公開鍵は新しいものに変わっていますが、⑧で見た公開鍵は、②、③の公開鍵のままです。

    (ソース)
    -------------------------------------------------------------------------------------------------------------------------------------
    ①X509Certificate2 x509 = new X509Certificate2(<初期作成用のpfxファイル>, "", X509KeyStorageFlags.Exportable);

    ②Debug.WriteLine(@"PublicKey.Key      [" + x509.PublicKey.Key.ToXmlString(false) + "]");
    ③Debug.WriteLine(@"GetPublicKeyString [" + x509.GetPublicKeyString() + "]");

    ④RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048);

    ⑤RSAParameters rsaPara = rsa.ExportParameters(false);

    ⑥((RSACryptoServiceProvider)(x509.PublicKey.Key)).ImportParameters(rsaPara);

    ⑦Debug.WriteLine(@"PublicKey.Key      [" + x509.PublicKey.Key.ToXmlString(false) + "]");
    ⑧Debug.WriteLine(@"GetPublicKeyString [" + x509.GetPublicKeyString() + "]");

    ⑨byte[] p12 = x509.Export(X509ContentType.Pkcs12, "");
    ⑩File.WriteAllBytes(<新しいpfxファイル>, p12);
    -------------------------------------------------------------------------------------------------------------------------------------

    2010年3月8日 6:02