ゆれくるコール開発日誌

ゆれくるコール、あめふるコール、つながるコールや緊急地震速報のことなど

Windows 2008 Server + ASP.NETでp12ファイルを読みこむとエラー

Windows 2008 Serverで、APS.NETのWebアプリよりp12ファイルを、下記のコードで読み込む。
.NET Frameworkのバージョンは4.0。

X509Certificate certificate = new X509Certificate2(System.IO.File.ReadAllBytes("p12証明書ファイルパス"), "パスワード");


すると、下記のようなエラーが発生。。

System.Security.Cryptography.CryptographicException: 内部エラーが発生しました。
場所 System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
場所 System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
場所 System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
場所 System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password)
・
・


えっと、、内部エラーっていわれても全然わからないんですけど。。
同じコードで開発環境のWindows7や、Windows 2003 Serverではこれで動いていたんだけどなー。


いろいろ調べてみると、ASP.NETのプロセスが、ユーザのキーストアにアクセスできないことが原因の模様。
下記のサイトが参考になりました。ありがとうございます!


C#: ERROR CREATING X509CERTIFICATE2 FROM A PFX OR P12 FILE IN PRODUCTION


こちらのサイトを参考に、コードを下記のように修正しました。
ユーザのキーストアではなく、ローカルコンピュータのキーストアを使用するように、X509Certificate2()の引数を追加。

X509Certificate certificate = new X509Certificate2(System.IO.File.ReadAllBytes("p12証明書ファイルパス"), "パスワード", X509KeyStorageFlags.MachineKeySet);


この修正で、無事動作するようになりました♪
だれかの参考になれば!