トップ回答者
X.509証明書のファイル保存

質問
-
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 は使用したくありません。
回答
-
以下方法でうまくゆきましたので、報告しておきます。
X509Certificate2クラスのPublicKey.Keyプロパティ、PrivateKeyプロパティが、
RSACryptoServiceProviderクラスのオブジェクトであるというところがポイントでした。
ですので、RSACryptoServiceProviderのExportParameters、ImportParametersを使って、RSAParametersを経由して
X509Certificate2、RSACryptoServiceProvider間の変換が行えます。
これによって、以下が出来る様になります。
・RSACryptoServiceProviderで公開鍵、秘密鍵を生成→X509Certificate2に変換→X509形式のファイルを作成
・X509形式のファイル→X509Certificate2で読み込み→RSACryptoServiceProviderに変換→RSAの暗号化・複合を実行- 回答としてマーク 高橋 春樹 2010年2月23日 8:13
すべての返信
-
以下方法でうまくゆきましたので、報告しておきます。
X509Certificate2クラスのPublicKey.Keyプロパティ、PrivateKeyプロパティが、
RSACryptoServiceProviderクラスのオブジェクトであるというところがポイントでした。
ですので、RSACryptoServiceProviderのExportParameters、ImportParametersを使って、RSAParametersを経由して
X509Certificate2、RSACryptoServiceProvider間の変換が行えます。
これによって、以下が出来る様になります。
・RSACryptoServiceProviderで公開鍵、秘密鍵を生成→X509Certificate2に変換→X509形式のファイルを作成
・X509形式のファイル→X509Certificate2で読み込み→RSACryptoServiceProviderに変換→RSAの暗号化・複合を実行- 回答としてマーク 高橋 春樹 2010年2月23日 8:13
-
うまくいったと思ったのですが、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);
-------------------------------------------------------------------------------------------------------------------------------------