15

MSDN で説明されている手順に従って、ASP.NET 2.0 Web アプリケーションの Web.Config ファイルで接続文字列の値を暗号化しようとしています。RsaProtectedConfigurationProvider を使用して、開発マシンでマシン レベルのキーを作成およびエクスポートし (-pri フラグを使用)、キーをインポートして Web サーバーへのアクセスを許可しました。ASP.NET による自動復号化をテストする前に、手動で Web.Config の復号化を試みたいと思いました。

-pef パラメーターと -pdf パラメーターをそれぞれ使用して、同じマシンで Web.Config を手動で暗号化および復号化できますが、Web サーバーで手動で復号化するとBad Dataエラー メッセージが表示されて失敗します。

最も奇妙なことは、Web.Config ファイルの keyContainerName 属性が無視されているように見えることです。正しい値を意味不明なもの (作成したキー コンテナーに対応しなくなったもの) に置き換えようとしても、暗号化と復号化は開発マシンで引き続き機能します。何か案は?

4

7 に答える 7

7

あなたの説明から、エクスポート可能な RSA プロバイダーを介して web.config を暗号化することに関していくつかの問題が発生していますよね?

RSA 暗号化リファレンスによると、いくつかのローカル テストを実行しました。RSA プロバイダーを介して web.config セクションを暗号化し、他のマシンに移動する通常のプロセスは次のとおりです。

====================== ステップ1

コンピューター レベルの RSA キー コンテナーを作成します: aspnet_regiis -pc "MyTestKeys" -exp

ステップ2

RSA 暗号化キーへの読み取りアクセスを許可します。

aspnet_regiis -pa "MyTestKeys" "NT AUTHORITY\NETWORK SERVICE"

ステップ 3

構成ファイルを暗号化します: aspnet_regiis -pef "connectionStrings" "Web サイト フォルダーの物理パス" -prov MyRSAProvider

次の手順を使用して、コンテナをエクスポートし、他のマシンにインポートして戻します

ステップ 4

マシン レベルの RSA キー コンテナーをエクスポートします: aspnet_regiis -px "MyTestKeys" "c:\Config-Key.xml" -pri

ステップ 5

Config-Key.xml を 2 台目のサーバーの c:\ にコピーします。

ステップ 6

2 番目のサーバーにマシン レベルの RSA キー コンテナーをインポートします: aspnet_regiis -pi "MyTestKeys" "c:\Config-Key.xml"

ステップ 7

RSA 暗号化キーへの読み取りアクセスを許可します: aspnet_regiis -pa "MyTestKeys" "NT AUTHORITY\NETWORK SERVICE"

ステップ 8

暗号化された web.config を 2 番目のサーバーにコピーします

========================

あなたが言及した手順に基づいて、あなたが従ったプロセスのほとんどは正しいはずです. これまでのところ、次のことを確認することをお勧めします。

  1. カスタム RSA プロバイダーの設定をチェックして、ターゲット マシンにも正しくコピーされ、マシン コンテナーを使用するように設定されているかどうかを確認します。

========構成セクションの暗号化=======

type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

  1. 上記の手順と同様に、RSA キー コンテナーを作成した後、"aspnet_regiis -pa" を使用して、(ASP.NET アプリケーションを実行する) 特定のアカウントにキー コンテナーへの十分なアクセス許可があることを確認する必要があります。通常、VS 2008/VS 2005 テスト サーバーを使用して ASP.NET アプリケーションを実行する場合、ログオン ユーザー (おそらく管理者) を使用しますが、IIS で ASP.NET を実行する場合 (または、別の異なるプロセス アカウントを使用している他のサーバー)、特定のプロセス アカウントにアクセス許可が付与されていることを確認する必要があります。

それらをチェックして、問題がそれらの一部によるものかどうかを確認できます。

敬具 Sanjay Manju suman

于 2010-01-30T09:43:24.587 に答える
1

暗号化する要素の名前では大文字と小文字が区別されることに注意してください。したがって、「connectionstrings」や「ConnectionStrings」ではなく「connectionStrings」を使用する必要があります。

于 2010-02-01T09:37:08.523 に答える
0

実際には、接続文字列を暗号化するためだけに Microsoft の EL を使用できます。ここからダウンロードできます: http://www.codeplex.com/entlib

h番目

于 2009-12-28T08:44:20.707 に答える
0

RsaProtectedConfigurationProvider は、マシン アカウントまたはユーザー アカウントを使用してキーを暗号化し、「キー コンテナー」と呼ばれるファイルに保存します。このファイルは通常、C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA に保存されます。また、ASP.NET ワーカー プロセス ID (XP/2000 の ASPNET ユーザーまたは 2003 の場合はネットワーク サービス) は、これらのファイルにアクセスして解読できるようにする必要があります。そうしないと、このエラー メッセージが表示されます。

詳細については、このリンクを確認してください

http://msdn.microsoft.com/en-us/library/dtkwfdky.aspx

于 2010-01-30T09:37:27.550 に答える
0

mahdiが言ったように、暗号化は非常に大文字と小文字を区別します。私は自分の PC で使用し、問題があったサーバーに持っていきました。問題は、PC フォルダーまたはディレクトリに保存されている RSA マシン キー コンテナーからのものでした。変更を加える前に、どこから修正を開始できるかを知りたい場合は、

\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys.

情報については、役立つかもしれないこのリンクを参照してください....

http://msdn.microsoft.com/en-us/library/ms998283.aspx

于 2010-02-02T17:41:53.580 に答える
0

これは、接続文字列を暗号化および復号化する別の方法です。vs2010 を使用している場合はチェックしてから、管理者として実行して vs2010 を開きます。

string provider = "RSAProtectedConfigurationProvider";

string section = "connectionStrings"; 

protected void btnEncrypt_Click(object sender, EventArgs e) 

{

   Configuration confg =
   WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

   ConfigurationSection configSect = confg.GetSection(section);

   if (configSect != null)

   {
      configSect.SectionInformation.ProtectSection(provider);
      confg.Save();

   }

}
protected void btnDecrypt_Click(object sender, EventArgs e)
{
    Configuration config =
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    ConfigurationSection configSect = config.GetSection(section);
    if (configSect.SectionInformation.IsProtected)
    {
        configSect.SectionInformation.UnprotectSection();
        config.Save();
    }
}
于 2012-05-08T11:25:36.000 に答える