在.NET Core用户机密secrets.json中存储多行RSA密钥的方案咨询
解决ASP.NET Core 3中User Secrets存储多行RSA密钥的简便方案
我之前做GitHub App开发时也碰到过这个头疼的问题,给你几个不用额外工具就能搞定的简便方法:
直接在secrets.json中使用转义换行符
JSON虽然不支持原生多行字符串,但可以用\n替代实际换行。你只需要把PEM密钥的每一行内容用\n连接成单行字符串就行。比如:{ "GitHubAppSettings:RsaPrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAz...\n...\n-----END RSA PRIVATE KEY-----" }这种格式完全能被Configuration和Options类正常绑定,直接绑定到string类型的属性上就可以使用,不用做额外处理。
用dotnet CLI命令直接导入PEM文件
要是觉得手动转义太麻烦,直接用dotnet的用户密钥命令就能一键导入整个PEM文件。打开命令行,切换到你的ASP.NET Core项目目录,执行以下命令:dotnet user-secrets set "GitHubAppSettings:RsaPrivateKey" "$(cat ./path/to/your/private-key.pem)"这个命令会自动读取PEM文件内容,把换行转成
\n并存到user secrets里,全程不用手动编辑JSON,特别高效。自定义类型转换器(适合坚持用数组存储的场景)
如果你确实想用数组存储密钥各行,可以给Options类的属性加个自定义类型转换器,自动把数组拼接成完整字符串。比如先定义转换器:public class StringArrayToStringConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType == typeof(string[]) || base.CanConvertFrom(context, sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is string[] array) { return string.Join(Environment.NewLine, array); } return base.ConvertFrom(context, culture, value); } }然后在Options的属性上标记:
public class GitHubAppSettings { [TypeConverter(typeof(StringArrayToStringConverter))] public string RsaPrivateKey { get; set; } }这样就算secrets.json里用数组存储各行,绑定的时候也会自动拼成完整的密钥字符串。不过这个方法不如前两个简便,除非有特殊需求才用。
前两个方法我在开发GitHub App时都用过,尤其是CLI命令的方式,导入密钥快得很,完全不用折腾转义的事。
内容的提问来源于stack exchange,提问作者Jan Suchotzki




