web-dev-qa-db-ja.com

AzureWebサイトのサイトがX509Certificate2の処理に失敗する

Azure Webサイト(ホステッドサービスではない)にサイトがあり、そこで秘密鍵を使用して.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/ デフォルトでシステムが原因で発生することがわかりましたユーザーのローカルディレクトリを使用してキーを格納します。ただし、AzureWebサイトにはローカルユーザープロファイルディレクトリがありません。同じ記事で、著者は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)

誰かがそれが起こる理由とそれを修正する方法を理解するのを手伝ってくれますか?

35
Roman Oleynik

回避策を見つけたと思いますが、他の人がこれに苦労している場合は、別のSO質問:

PKCS#12バイト配列からX509Certificate2を構築すると、CryptographicException( "システムは指定されたファイルを見つけることができません。")?

魔法は、X509KeyStorageFlagsストレージフラグを指定することです。例:

var myCertificae = new X509Certificate2(
    certificateData,
    securePasswordString,
    X509KeyStorageFlags.MachineKeySet | 
    X509KeyStorageFlags.PersistKeySet | 
    X509KeyStorageFlags.Exportable);
88
Jon Odgård

Azure Webサイトは、証明書ストアに証明書をインストールするためのネイティブサポートを備えています。あなたはそのショットを与えましたか?

詳細はこちら: http://Azure.Microsoft.com/blog/2014/10/27/using-certificates-in-Azure-websites-applications/

6
Zain Rizvi

AzureWebサイトは共有環境で実行されます。証明書のコンストラクターがインスタンスに一時的な情報を作成しようとしていて、アクセス許可がないことを前提としています。

昇格されたコンテキストで実行してこの作業を実行するには、ホストされたサービスにアップグレードする必要がある場合があります。

また、パスワードが正しいことを確認しましたか?パスワードを必要としない場合は、少なくともstring.Emptyをコンストラクターに渡す必要があります。 NULL値を渡すと、この例外も発生します。

0
Justin Patten

Azure Webサイト/ Webアプリ/モバイルアプリでは、SSL証明書をインポートすることを許可するApp Service Planを使用する必要があるため、無料または共有ではありません。 SSL証明書だけでなく、コード署名証明書の例をインポートして、signtoolまたはPowerShellから使用することもできます。

私はこの方法を https://vmplace.eu/ で使用しました

無料プランまたは共有プランを使用しようとすると、エラーが発生します。そのため、これらのプランのAzureには、他のバージョンの.NETFrameworkがあります。

このプロジェクトも参照できます: https://github.com/onovotny/SignService

mvpbuzz

0
Mariusz Ferdyn

私はまったく同じ問題を抱えていて、それを修正するのに何時間も苦労しました。あなたが最後のスタック呼び出しが関数LoadCertFromFileであるとあなたが言及した記事では、しかしあなたの(そして私の)場合はLoadCertFromBlob

だから私はLoadCertFromBlobを探して、これを見つけました:

X509Certificate2がblobからの作成に失敗することがあるのはなぜですか?

解決策は、IISに移動し、アプリケーションプールIDを「ApplicationPoolIdentity」から「LocalService」に変更して、証明書が正しいローカルフォルダーに読み込まれるようにすることでした。

0
Sean