17

RSACryptoServiceProvider を使用して、既知の秘密鍵 (変数に格納されている) を使用して一部のデータを復号化するアプリケーションがあります。

IIS アプリケーション プールが Network Service を使用するように構成されている場合、すべてが正常に実行されます。

ただし、別の ID でコードを実行するように IIS アプリケーション プールを構成すると、次のようになります。

System.Security.Cryptography.CryptographicException: 指定されたファイルが見つかりません。

   System.Security.Cryptography.Utils.CreateProvHandle (CspParameters パラメーター、ブール値の randomKeyContainer) で
   System.Security.Cryptography.RSACryptoServiceProvider.ImportParameters (RSAParameters パラメーター) で
   System.Security.Cryptography.RSA.FromXmlString (文字列 xmlString) で

コードは次のようなものです。

byte[] input; 
byte[] output; 
string private_key_xml; 

var provider = new System.Cryptography.RSACryptoServiceProvider(this.m_key.Key_Size);
provider.FromXmlString(private_key_xml); // Fails Here when Application Pool Identity != Network Service

ouput = provider.Decrypt(input, false); // False = Use PKCS#1 v1.5 Padding

ユーザーにマシン キー ストアへの読み取りアクセス権を付与する必要があると述べて回答しようとするリソースがありますが、この問題を解決するための決定的な回答はありません。

環境: IIS 6.0、Windows Server 2003 R2、.NET 3.5 SP1

4

5 に答える 5

37

I fixed this by setting "Load User Profile" to True (was False) in the Application Pool's Advanced Settings / Process Model section.

The application had been working perfectly on Server 2003 R2 / IIS 6 and the problem appeared as I was configuring it on our new 2008 R2 server.

Got the idea to try it at:

http://social.msdn.microsoft.com/forums/en-US/clr/thread/7ea48fd0-8d6b-43ed-b272-1a0249ae490f/

YMMV

于 2010-04-29T23:14:48.507 に答える
12

実際、このようなコードを実行する必要があります

CspParameters _cpsParameter;
RSACryptoServiceProvider RSAProvider;

_cpsParameter = new CspParameters();
_cpsParameter.Flags = CspProviderFlags.UseMachineKeyStore;

RSAProvider = new RSACryptoServiceProvider(1024, _cpsParameter); 

次のユーザーは、フォルダにアクセスする必要があります: C:\Documents and Settings\All Users\Application data\Microsoft\Crypto\RSA\MachineKeys

  1. IIS ユーザー アカウント (匿名)
  2. web.config 設定でアプリケーションを偽装するために使用するユーザー アカウント。

だから今、私にとってはうまくいっています。

于 2009-08-24T19:41:42.783 に答える
8

設定してみる

System.Security.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;

編集: 次に使用してみてください

var provider = new System.Security.Cryptography.RSACryptoServiceProvider();

整数パラメーターを持つコンストラクターの代わりに。そのコンストラクターは、指定されたキーの長さでキーを生成しようとしますが、アクセス許可ではそれを実行できない場合があります。

于 2009-07-09T10:03:15.103 に答える
2

Rasmus Faberのソリューションが私のために働いたことをコメントしたかっただけです(1つのマイナーな編集で):

System.Cryptography.RSACryptoServiceProvider.UseMachineKeyStore = true;
RSACryptoServiceProvider provider = new System.Cryptography.RSACryptoServiceProvider();

MailBee.netにDKIMを使用して送信メッセージに署名させようとしましたが、OPが受信したのと同じメッセージを受け取りました。もちろん、開発マシンではすべて問題ありませんでしたが、クライアントのWebホストにアップロードすると、この問題が発生しました。私が言ったように、上記の解決策は私のために機能しましたが、私がオンラインで見つけた他のもの(上記のmsdnフォーラムリンクを含む)は機能しませんでした。

(私は賛成してコメントしますが、そうするのに十分な担当者がいません。:P)

ラスマス・フェイバーに感謝します!

于 2010-08-25T03:27:38.053 に答える
0

追加するときだけ

フラグ = CspProviderFlags.UseMachineKeyStore

問題は解決しました。

{
    string keyName = "Secret***";
    CspParameters parameters = new CspParameters()
    {
        KeyContainerName = keyName,
        Flags = CspProviderFlags.UseMachineKeyStore
    };
}
于 2021-01-19T15:33:38.077 に答える