必须使用 protectedconfiguration 加密连接字符串,手动 aes 加密会破坏 .net 自动解密流程;.net core+ 需改用 iconfigurationbuilder 与外部密钥管理(如 azure key vault),aspnet_regiis.exe 已废弃。

连接字符串加密必须用 ProtectedConfiguration,别自己手写 AES
自己用 AesCryptoServiceProvider 加密连接字符串看似可控,实际会破坏 .NET 配置系统的自动解密流程,导致运行时抛出 ConfigurationErrorsException:「无法解密已加密的节」。.NET 的配置加密机制依赖 ProtectedConfigurationProvider 接口,只有它注册的提供者(如 RsaProtectedConfigurationProvider 或 DataProtectionConfigurationProvider)才能被 ConfigurationManager 自动识别和解密。
实操建议:
- 只使用
ProtectedConfiguration类的ProtectSection方法加密connectionStrings节,不要手动加密字符串值再填回去 - 加密前确保目标机器已注册对应 provider(Windows Server 上默认有
RsaProtectedConfigurationProvider;Windows 10/11 开发机默认用DataProtectionConfigurationProvider) - 加密命令行操作最稳:
aspnet_regiis.exe -pef "connectionStrings" "C:\MyApp"(注意路径是物理目录,不是 Web.config 所在路径)
aspnet_regiis.exe 在 .NET Core / .NET 5+ 里根本不存在
这是最容易踩的坑:项目迁到 net6.0 或更高版本后,aspnet_regiis.exe 已被彻底移除,且 ProtectedConfiguration 类本身也不再受支持。此时硬套旧文档只会卡在「找不到类型」或「方法不可用」。
实操建议:
- .NET Core 及以后统一走
IConfigurationBuilder+ 外部密钥管理,比如用AddUserSecrets(开发阶段)、AddAzureKeyVault(生产)、或AddEnvironmentVariables(配合 Azure App Settings) - 连接字符串不再硬编码进
appsettings.json,而是通过环境变量注入:ConnectionStrings__DefaultConnection=Server=...;Password=<font color="red">env_var_value</font> - 如果必须文件加密,改用
dotnet user-jwts工具不现实,应直接用操作系统级保护:Windows 用 DPAPI(ProtectedData类),Linux/macOS 用libsecret或keychain封装层(需自行实现IConfigurationProvider)
加密后 ConfigurationManager.ConnectionStrings 仍为空?检查 section 声明
即使加密成功,代码里调 ConfigurationManager.ConnectionStrings["xxx"] 返回 null,大概率是 web.config 或 app.config 里漏写了 configSections 声明,或者 provider 名称拼错。
常见错误现象:
- 加密后 XML 看起来正常(有
<encrypteddata></encrypteddata>),但运行时报NullReferenceException - 用
ConfigurationManager.OpenExeConfiguration读取时,ConnectionStrings集合长度为 0
实操建议:
- 确认 config 文件顶部有这段声明:
<configsections><section name="connectionStrings" type="System.Configuration.ConnectionStringSettingsCollection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" requirepermission="false"></section></configsections> - 检查加密命令中指定的 section 名是否严格等于配置文件中的节点名(大小写敏感,不能写成
ConnectionStrings) - 调试时用
ConfigurationManager.GetSection("connectionStrings")看返回对象是否为EncryptedXml实例,而不是 null
本地开发用 RSA 加密,上线就炸?权限和密钥容器是关键
RsaProtectedConfigurationProvider 默认用机器级密钥容器,开发机加密的配置,部署到服务器时因找不到同名密钥容器而解密失败,报错信息通常是:CryptographicException: The keyset does not exist。
实操建议:
- 生产环境统一用
DataProtectionConfigurationProvider(.NET 4.7.2+ 默认),它基于 Windows DPAPI,自动绑定机器或用户上下文,无需导出密钥 - 若坚持用 RSA,必须在目标服务器上提前创建密钥容器:
aspnet_regiis.exe -pc "MyKeys" -exp,再用-pa "MyKeys" "NT AUTHORITY\NETWORK SERVICE"授权应用池账户 - 避免跨服务器共享密钥容器——这不是设计目标,强行复制
%WinDir%\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files下的密钥文件极不可靠
真正麻烦的从来不是“怎么加密”,而是“谁在什么时候、以什么身份、用哪把钥匙去解密”。provider 选错、容器没授权、运行账户没权限、框架版本跨代——任何一个环节断掉,连接字符串就只是段 Base64 编码的乱码。










