appsettings.json中含引号的证书密码转义问题求助
解决secrets.json中带引号的PFX证书密码无法正确读取的问题
我在secrets.json(而非appsettings.json)里配置了带双引号的PFX证书密码,试了好几种常规JSON转义写法,读取到的字符串始终不对。
我试过的写法包括:
{ "CertPass": "abc"123", ... } { "CertPass": "abc\"123", ... } { "CertPass": "abc""123", ... } { "CertPass": "abc\\\"123", ... }
读取密码的C#代码是这样的:
string pass = config.Env<string>("CertPass"); public static class ConfigurationExtensions { public static T Env<T>(this IConfiguration self, string key) => self.GetSection(key).Get<T>()!; }
参考连接字符串的转义方案(用单引号包裹或替换为")也没用,读取后符号会原封不动保留。目前只能先用¤替代引号,再在代码里替换回来,求正确的解决办法。
正确解决方案
1. 严格按JSON规范转义
JSON字符串里的双引号必须用单个反斜杠\转义,secrets.json的正确写法如下:
{ "CertPass": "abc\"123" }
保存后,.NET配置系统会直接解析出abc"123。注意编辑文件时,确保编辑器不会自动移除反斜杠(比如VS Code、Rider这类编辑器默认会正确保留)。
2. 用Base64编码绕过转义
如果转义方式还是有问题,可以把密码转成Base64编码存储:
- 把原密码
abc"123转成Base64(比如用C#代码Convert.ToBase64String(Encoding.UTF8.GetBytes("abc\"123"))生成,结果是YWJjIjEyMw==) - 在
secrets.json里存编码后的值:{ "CertPass": "YWJjIjEyMw==" } - 代码里读取后解码:
string encodedPass = config.Env<string>("CertPass"); string pass = Encoding.UTF8.GetString(Convert.FromBase64String(encodedPass));
3. 用命令行设置用户密钥(推荐)
如果用dotnet user-secrets命令设置密码,能自动处理转义,不用手动改JSON:
- PowerShell环境执行:
dotnet user-secrets set "CertPass" 'abc"123' - CMD环境执行:
dotnet user-secrets set "CertPass" "abc\"123"
命令行会自动生成符合规范的JSON内容,直接就能正确读取。
内容的提问来源于stack exchange,提问作者Konrad Viltersten
相关产品推荐
相关产品推荐

