ASP.NET 2.0 內建 aspnet_regiis.exe 工具與 ConfigurationSection.ProtectSection API,支援使用 DPAPI(Data Protection API)或 RSA 金鑰容器加密 Web.config 敏感區段(如資料庫連線字串、API 金鑰)。本文說明命令列與程式碼兩種加密方式,以及部署至伺服器陣列的金鑰匯出入流程。
| 提供者 | 加密方式 | 適用場景 | 跨伺服器部署 |
|---|---|---|---|
| DPAPI (DataProtectionConfigurationProvider) | 機器層級或使用者層級金鑰 | 單一伺服器、開發環境 | 需同步機器金鑰或使用 RSA |
| RSA (RsaProtectedConfigurationProvider) | RSA 金鑰容器(可匯出) | 伺服器陣列、雲端部署、CI/CD | 匯出金鑰至其他伺服器即可 |
# 使用 DPAPI (機器層級)
aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "DataProtectionConfigurationProvider"
# 使用 RSA (需先建立金鑰容器)
aspnet_regiis -pe "connectionStrings" -app "/MyApp" -prov "RsaProtectedConfigurationProvider"
參數說明:-pe 加密區段、-pd 解密區段、-app 應用程式虛擬路徑、-prov 指定提供者。
# 1. 建立可匯出的 RSA 金鑰容器
aspnet_regiis -pc "MyKeys" -exp
# 2. 授予應用程式集區身分識別讀取權限
aspnet_regiis -pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"
aspnet_regiis -pa "MyKeys" "IIS_IUSRS"
# 3. 匯出金鑰含私鑰(備份/部署用)
aspnet_regiis -px "MyKeys" "C:\Keys\MyKeys.xml" -pri
# 4. 於其他伺服器匯入
aspnet_regiis -pi "MyKeys" "C:\Keys\MyKeys.xml"
# 5. 設定 Web.config 使用自訂 RSA 提供者
# 見下方 Web.config 範例
using System.Configuration;
using System.Web.Configuration;
public void EncryptConfigSection(string sectionName, string providerName)
{
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
ConfigurationSection section = config.GetSection(sectionName);
if (section != null && !section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection(providerName);
config.Save();
}
}
// 使用範例
EncryptConfigSection("connectionStrings", "DataProtectionConfigurationProvider");
EncryptConfigSection("appSettings", "RsaProtectedConfigurationProvider");
<configuration>
<configProtectedData>
<providers>
<add name="MyRsaProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
keyContainerName="MyKeys"
useMachineContainer="true" />
</providers>
</configProtectedData>
<connectionStrings configProtectionProvider="MyRsaProvider">
<EncryptedData>...</EncryptedData>
</connectionStrings>
</configuration>
開啟 Web.config,原明文區段將變為:
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData Type="https://www.w3.org/2001/04/xmlenc#Element" xmlns="https://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="https://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="https://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="https://www.w3.org/2001/04/xmlenc#">...</EncryptedKey>
</KeyInfo>
<CipherData><CipherValue>...</CipherValue></CipherData>
</EncryptedData>
</connectionStrings>
執行階段 ASP.NET 會自動解密,程式碼 ConfigurationManager.ConnectionStrings["name"].ConnectionString 無需修改即可取得明文。
aspnet_regiis -pd "connectionStrings" -app "/MyApp"
aspnet_regiis -pe "connectionStrings" -app "/App" 即可。aspnet_regiis -pc "Keys" -exp,匯出 -px、匯入 -pi。aspnet_regiis -pa "Keys" "IIS APPPOOL\AppPoolName" 讀取金鑰權限。connectionStrings、appSettings、system.net/mailSettings 等敏感區段,保留其他區段可讀性。Web.config 提交至 Git。使用 Web.config.transform、Azure Key Vault、AWS Secrets Manager、HashiCorp Vault 管理機密。ASP.NET Core 棄用 Web.config,改用 appsettings.json + User Secrets (開發) + Azure Key Vault / Environment Variables (生產)。加密由基礎設施層處理,應用程式碼不再涉及加解密邏輯。