79

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

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

共有 Web ホスティング サーバーでエラーが発生しました。

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

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

makecert -r -n "CN=myhost.com, E=admin@myhost.com" -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 を使用しています

4

2 に答える 2

146

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

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

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

ディスクから証明書を読み取ってオブジェクトに格納している場合でも、秘密キーは引き続き Microsoft 暗号化 API 暗号化サービス プロバイダーのキー データベースに格納されます。ホスティング サーバーでは、ASP.NET プロセスにユーザー ストアへのアクセス許可がありません。

別のアプローチ (以下のいくつかのコメントによる) は、IIS 構成またはアプリケーション プール ID を変更することです。これは機能します。ただし、これは、これらの構成項目へのアクセスがあることを前提としていますが、そうでない場合もあります (共有ホスティング環境など)。

于 2009-08-28T06:48:09.467 に答える
13

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

「指定された状態での使用に対してキーが無効です」

少しグーグルで調べた後、次のように変更することを提案する投稿を見つけました。

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

これで私の問題は解決しました。

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

于 2015-09-09T09:17:57.143 に答える