web-dev-qa-db-ja.com

"内部エラーが発生しました。" X509Certificate2で​​pfxファイルをロードする場合

私は自己署名証明書(c#)を使用しようとしています:

X509Certificate2 cert = new X509Certificate2(
    Server.MapPath("~/App_Data/myhost.pfx"), "pass");

共有ウェブホスティングサーバー上でエラーが発生しました:

System.Security.Cryptography.CryptographicException: An internal error occurred.

スタックトレースは

System.Security.Cryptography.CryptographicException.
    ThrowCryptogaphicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils.
    _LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, 
        Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.
    LoadCertificateFromFile(String fileName, Object password, 
        X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
    String fileName, String password) +131

私の開発マシンでは、問題なくロードされます。秘密鍵アクセスが必要なため、*。pfxではなく* .pfxをロードする理由(cerファイルはOKをロードします)。私はそのようなdev mochineでpfxを作成しました:

makecert -r -n "CN=myhost.com, [email protected]" -sky exchange -b 01/01/2009
    -pe -sv myhost.pvk myhost.cer
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code>

Makecertのバージョンv5.131.3790.0を使用しています

76
tmp3128

秘密鍵にローカルコンピューターストアを使用します。

X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass",
    X509KeyStorageFlags.MachineKeySet);

MachineKeySet は、「秘密鍵は現在のユーザーストアではなくローカルコンピューターストアに格納される」と説明されています。フラグなしのデフォルトでは、ユーザーストアに配置されます。

ディスクから証明書を読み取ってオブジェクトに保存している場合でも、秘密キーは引き続きMicrosoft Cryptographic API Cryptographic Service Providerキーデータベースに保存されます。ホスティングサーバーでは、ASP.NETプロセスにユーザーストアにアクセスする権限がありません。

別のアプローチ(以下のコメントによる)は、IIS構成またはアプリプールIDを変更することです。これは機能します。ただし、これらの構成アイテムへのアクセスは、ケース(共有ホスティング環境など)。

140
Randy Levy

RandyのMachineKeySetに変更するソリューションを試しましたが、エラーメッセージが表示されました。

「指定された状態でのキーの使用は無効です」

だから、少しグーグルで調べた後、私はそれを次のように変更することを提案する投稿を見つけました:

var certificate = new X509Certificate2(certKeyFilePath, passCode, 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |       
X509KeyStorageFlags.PersistKeySet );

これで私の問題が整理されました。

IIS構成でアプリプールの設定を変更する提案をまだ試していません。これを行うには、サイトのアプリプールの詳細設定に移動し、[ユーザープロファイルの読み込み]をtrue。この設定がfalseの場合、キーコンテナーは明らかにアクセスできません。

10
Myke Black