Azure Websites (ホスト サービスではない) にサイトがあり、そこで秘密キーを使用して .pfx 証明書を処理する必要があります。
var x509Certificate2 = new X509Certificate2(certificate, password);
しかし、次のような例外に直面しました。
System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
記事中http://blog.tylerdoerksen.com/2013/08/23/pfx-certificate-files-and-windows-azure-websites/デフォルトでは、システムがユーザーのローカル ディレクトリを使用してキーを保存するため、この問題が発生することがわかりました。ただし、Azure Websites にはローカル ユーザー プロファイル ディレクトリがありません。同じ記事で、著者はX509KeyStorageFlags.MachineKeySet
フラグの使用を提案しています。
var x509Certificate2 = new X509Certificate2(certificate, password, X509KeyStorageFlags.MachineKeySet);
しかし、今は別の例外があります:
System.Security.Cryptography.CryptographicException: Access denied.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
なぜこのようなことが起こるのか、またどうすれば修正できるのか、誰か教えてくれませんか?
ベストアンサー1
回避策を見つけたと思いますが、他の人もこれに苦労している場合は、別の SO の質問で答えを見つけました:
PKCS#12 バイト配列から X509Certificate2 を構築すると、CryptographicException("指定されたファイルが見つかりません。") がスローされるのはなぜですか?
魔法は、X509KeyStorageFlags ストレージ フラグを指定することです。例:
var myCertificae = new X509Certificate2(
certificateData,
securePasswordString,
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable);