在 .NET core 用户机密 (JSON) 中存储多行 RSA 密钥

Jan*_*zki 6 c# json github .net-core asp.net-core

在开发 ASP.NET core 3 应用程序期间存储机密(例如 API 密钥和密码)的推荐方法是使用用户机密。虽然这种方法效果很好,但我确实有一个包含RSA key 的多行字符串。密钥是从提供的.pem复制的文件复制的。

有没有什么简单的方法可以将密钥存储在secrets.json

问题似乎是json不支持多行字符串。因此,简单地将密钥复制到文件中是行不通的。诸如对密钥的不同行使用数组之类的解决方法与类不能很好地配合Configuration,并将检索到的秘密绑定到Options类。

我发现一旦我将密钥转换为单行字符串,它就可以工作。然而,在我看来,需要一个单独的工具将密钥从多行转换为单行,这似乎太复杂了。

顺便说一句,我确实需要这个来构建GitHub-App

pin*_*x33 3

没有什么可以阻止您使用带有用户机密的多行字符串。可以直接传一份给dotnet user-secrets

例如,某些 Powershell 使用此处字符串:

$multiVal = @"
Your
Multi-line 
Text
"@
dotnet user-secrets set "YourKeyName" "$multiVal"
Run Code Online (Sandbox Code Playgroud)

或者嵌入换行符 `n

dotnet user-secrets "YourKeyName" "Your`nMulti-line`nValue"
Run Code Online (Sandbox Code Playgroud)

或者您可以读取整个基于文本的文件:

$fileName = "/path/to/file" 
$multiVal = Get-Content $fileName -Raw
dotnet user-secrets set "YourKeyName" "$multiVal"
Run Code Online (Sandbox Code Playgroud)

JSON 字符串属性还允许“多行”文本,只是不是按照您想象的方式。字符串属性内部的文字字符\n一起将被反序列化为换行符。例如,以下 JSON 具有一个带有多行值的字符串属性:

{
  "YourKeyName": "Your\nMulti-line\nText" 
} 
Run Code Online (Sandbox Code Playgroud)

您可以通过多种方式实现此目的,例如手动查找和替换或使用 Notepad++ 等工具。您还可以再次使用一些 Powershell:

{
  "YourKeyName": "Your\nMulti-line\nText" 
} 
Run Code Online (Sandbox Code Playgroud)

编辑:您提到其中一个参数在最后一个示例中不起作用。您可能正在运行旧版本的 powershell(3.0 之前的版本)。你可以尝试这个:

$inputFile = "/path/to/file" 
$multiVal = Get-Content $inputFile -Raw
$obj = [pscustomobject]@{
   YourKeyName = $multiVal
}
$outputFile = "/path/to/secrets.json"
$obj | ConvertTo-Json -Depth 50 | Out-File -FilePath $outputFile
Run Code Online (Sandbox Code Playgroud)

现在,关于 RSA 密钥,根据此答案及其注释,虽然 RSA 规范要求在 base-64 编码的有效负载中换行,但实现可能允许不符合要求。这意味着,根据您使用它的方式,您可能能够完全删除换行符。你必须尝试一下才能确定。

编辑:事实证明,dotnet user-secrets有一个已知的错误,其中值不能有前导-。现在已修复,但我认为仅适用于 5.0+。我发现领先的空间是有效的,我认为RSA提供商不应该对此犹豫。以下应该有效:

$inputFile = "/path/to/file" 
# no -Raw flag 
$multiVal = (Get-Content $inputFile | Out-String)
# or alternatively 
$multiVal = [System.IO.File]::ReadAllText($inputFile)
$obj = [pscustomobject]@{
   YourKeyName = $multiVal
}
$outputFile = "/path/to/secrets.json"
# use redirection instead of Out-File
($obj | ConvertTo-Json -Depth 50) > $outputFile
Run Code Online (Sandbox Code Playgroud)