使用 SSH.NET 流式传输私钥的问题

sci*_*ino 4 c# ssh azure ssh.net

我正在使用 Renci.SshNet 库,并让它使用用户名和私钥。当从文件或文件流读取私钥时,我可以很好地打开私钥,但在内存流期间它会失败。

这有效:

var pk = new PrivateKeyFile(@"C:\myfile.ppk");
Run Code Online (Sandbox Code Playgroud)

这有效:

var f = new FileStream(@"C:\myfile.ppk", FileMode.Open, FileAccess.Read);
var pk = new PrivateKeyFile(f);
Run Code Online (Sandbox Code Playgroud)

这些失败并显示“私钥无效”。

var s = new MemoryStream(Encoding.UTF8.GetBytes(variablename));
//No carriage returns
var s = new MemoryStream(Encoding.UTF8.GetBytes(@"-----BEGIN RSA PRIVATE KEY----- <snip>"));
//Include carriage returns
var s = new MemoryStream(Encoding.UTF8.GetBytes(@"-----BEGIN RSA PRIVATE KEY----- <snip>"));
Run Code Online (Sandbox Code Playgroud)

我什至尝试了在 SO 上找到的流位置:

private Stream GenerateStreamFromString(string s)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    writer.Write(s);
    writer.Flush();
    stream.Position = 0;
    return stream;
}
Run Code Online (Sandbox Code Playgroud)

我一开始以为 Renci 库有一个 bug Stream,但显然文件流可以工作。我计划将字符串格式的密钥托管在天蓝色存储表中,但我对其他想法持开放态度。

Bru*_*hen 5

根据您的描述,我使用PuTTYgen通过SSH生成了我的私钥文件,并参考本教程将我的密钥转换为OpenSSH格式。根据您提供的有关使用的代码MemoryStream,我可以使其按预期工作,您可以参考它:

var f = new MemoryStream(Encoding.UTF8.GetBytes(@"-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----");
var pk = new PrivateKeyFile(f, "{password}");
Run Code Online (Sandbox Code Playgroud)

注意:我假设传递给您的私钥的字符串内容的Encoding.UTF8.GetBytes格式不正确。要隔离此原因,您可以尝试将加载的内容保存MemoryStream到文件中,如下代码并将其与C:\myfile.ppk.

memoryStream.CopyTo(fileStream);
Run Code Online (Sandbox Code Playgroud)

我计划将字符串格式的密钥托管在天蓝色存储表中,但我对其他想法持开放态度

据我所知,对于 Azure Web App 上托管的 Web 应用程序,您可以利用应用程序设置来存储键值对,这些键值对可以在运行时自动加载并覆盖 web.config 文件中的现有应用程序设置。

此外,您还可以利用Azure Blob 存储来私密存储您的私钥文件并按如下方式检索它:

using(var ms=new MemoryStream())
{
   cloudBlockBlob.DownloadToStream(ms);
   var pk = new PrivateKeyFile(ms, "{password}"); 
}
Run Code Online (Sandbox Code Playgroud)

注意:您可以按照本教程中的“加密 blob 数据”部分在客户端和服务器端加密 blob 数据。

此外,您可以利用Azure Key Vault来存储您的私钥。更多详细信息,您可以参考此官方文档来开始使用Azure Key Vault。