1. 開啟 Windows 命令提示字窗,先切換到 aspnet_regiis.exe 工具目錄下
$ cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
or
$ cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
2. 建立一個自己的金鑰容器(參數 -exp 代表允許匯出)
$ aspnet_regiis.exe -pc "MyCustomKeys" -exp
PS: 若出現建立失敗的訊息,請先確認目前的使用者是否有 C:\ProgramData\Microsoft\Crypto\RSA 目錄下的 MachineKeys 資料夾 Write 權限
3. 在 Web.config 檔的 configuration 內任一地方加入 configProtectedData 區塊,如以下
<configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" /> </configSections> ...... ...... <configProtectedData defaultProvider="MyProtectedProvider"> <providers> <add name="MyProtectedProvider" type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" keyContainerName="MyCustomKeys" useMachineContainer="true" /> </providers> </configProtectedData> ...... ...... </configuration>
4. 使用 MyProtectedProvider 來對 Web.config 裡的 appSettings 區段加密
$ aspnet_regiis.exe -pef appSettings "C:\Users\CoCo\WorkSpace\MyWebProject" -prov "MyProtectedProvider" //補充:若欲加密區段不在第一層,寫法如以下 $ aspnet_regiis.exe -pef system.web/machineKey/.../... "C:\Users\CoCo\WorkSpace\MyWebProject" -prov "MyProtectedProvider"
5. 加密測試成功後,接著就是要匯出目前使用的金鑰
$ aspnet_regiis.exe -px "MyCustomKeys" D:\MyCustomKeys.xml -pri
6. 將匯出的金鑰複製到目標伺服器然後輸入以下指令即完成
$ aspnet_regiis.exe -pi “MyCustomKeys” C:\MyCustomKeys.xml
7. 若有權限相關問題,導致伺服器無法開啟 RSA 金鑰容器時,可參考以下補充第 4 點給予應用程式權限,EX.
$ aspnet_regiis.exe -pa "MyCustomKeys" "IIS AppPool\DefaultAppPool"
8. 若之後要移除 RSA 金鑰容器時,可以輸入以下指令
$ aspnet_regiis.exe -pz "MyCustomKeys"
補充:使用預設的 RSA 金鑰加密,通常用在本機端測試
1. 一樣先切換到 aspnet_regiis.exe 工具目錄下,輸入以下指令
$ aspnet_regiis.exe -pef appSettings "C:\Users\CoCo\WorkSpace\MyWebProject"
2. 這時 Web.config 裡的 appSettings 區段就會被加密,如下圖
3. 此時,執行程式後,我遇到了以下問題(若你沒有,則直接跳到步驟5)
4. 此問題代表你當前沒有存取主機金鑰的權限,解決方式為輸入以下指令,賦予當前使用者權限
$ aspnet_regiis.exe -pa "MyCustomKeys" "CoCo-PC\CoCo"
當然之後可能也需要 IIS 有權限存取,所以我也會多輸入以下指令(非必要)
$ aspnet_regiis.exe -pa "MyCustomKeys" "NT AUTHORITY\NETWORK SERVICE"
IIS 7.5 後預設會使用 IIS AppPool\DefaultAppPool 帳號而非NT AUTHORITY\NETWORK SERVICE,這時就需改輸入以下
$ aspnet_regiis.exe -pa "MyCustomKeys" "IIS AppPool\DefaultAppPool"
假如不清楚目標網站是使用哪一個帳戶,可先使用下列程式碼取得
var currentIdentity = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
若測試完畢後想要移除權限,只需將參數 a 改成 r 即可,如下
$ aspnet_regiis.exe -pr "MyCustomKeys" "CoCo-PC\CoCo"
PS: 還有一個更直接的做法,直接將 C:\ProgramData\Microsoft\Crypto\RSA 目錄下的 MachineKeys 資料夾 Read 權限開啟給每個人,也能直接解決該權限問題
5. 當確定程式執行一切沒問題後,就會需要用到解密
$ aspnet_regiis.exe -pdf appSettings "C:\Users\CoCo\WorkSpace\MyWebProject"
參考資料:
[ASP.NET] 使用相同 RSA 金鑰容器幫 web.config 連線字串加密
[黑暗執行緒] web.config連線字串加密工具