C# 使用SSH.NET的流式私钥问题

C# 使用SSH.NET的流式私钥问题,c#,azure,ssh,ssh.net,C#,Azure,Ssh,Ssh.net,我正在使用Renci.SshNet库,并让它使用用户名和私钥。当从文件或文件流中读取私钥时,我可以让它很好地打开,但在内存流中它失败了 这项工作: var pk = new PrivateKeyFile(@"C:\myfile.ppk"); var f = new FileStream(@"C:\myfile.ppk", FileMode.Open, FileAccess.Read); var pk = new PrivateKeyFile(f); 这

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

这项工作:

var pk = new PrivateKeyFile(@"C:\myfile.ppk");
var f = new FileStream(@"C:\myfile.ppk", FileMode.Open, FileAccess.Read);
var pk = new PrivateKeyFile(f);
这项工作:

var pk = new PrivateKeyFile(@"C:\myfile.ppk");
var f = new FileStream(@"C:\myfile.ppk", FileMode.Open, FileAccess.Read);
var pk = new PrivateKeyFile(f);
这些操作会因“无效私钥”而失败


起初我认为Renci库在
流方面有一个bug,但显然文件流是有效的。我计划在azure存储表中以字符串格式托管密钥,但我愿意接受其他想法。

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

var f = new MemoryStream(Encoding.UTF8.GetBytes(@"-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----");
var pk = new PrivateKeyFile(f, "{password}");
注意:我假设传递给
Encoding.UTF8.GetBytes
的私钥的字符串内容格式不正确。要找出此原因,您可以尝试将加载的
MemoryStream
保存到一个文件中,如下代码所示,并将其与
C:\myfile.ppk
进行比较

memoryStream.CopyTo(fileStream);
我计划在azure存储表中以字符串格式托管密钥,但我愿意接受其他想法

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

此外,您还可以利用将私钥文件存储在private中,并按如下方式检索它:

using(var ms=new MemoryStream())
{
   cloudBlockBlob.DownloadToStream(ms);
   var pk = new PrivateKeyFile(ms, "{password}"); 
}
注意:您可以按照本文中的“加密blob数据”部分对客户端和服务器端的blob数据进行加密


此外,您还可以利用存储私钥。更多详细信息,您可以向这位官员咨询有关Azure Key Vault入门的信息。

上述答案对我很有帮助。我遇到了完全相同的问题,直接从文件中读取可以工作,但无法使memorystream工作。每次都会出现“无效私钥”错误

我将文件读入内存蒸汽的方式如下:

byte[] bytes = ReadSSHKeyFromDatabase();
MemoryStream ms = new MemoryStream();
ms.Read(bytes, 0, bytes.Length);
Renci.SshNet.PrivateKeyFile pkf = new Renci.SshNet.PrivateKeyFile(ms, Password);
但是我把它改成了这样:

byte[] bytes = ReadSSHKeyFromDatabase();
MemoryStream ms = new MemoryStream(bytes);
Renci.SshNet.PrivateKeyFile pkf = new Renci.SshNet.PrivateKeyFile(ms, Password);

我想我被这蒙蔽了双眼,你的基本调试帮助了我——我的头脑被问题弄得太深了,我忘记了基本的调试细节。出于某种原因,从Notepad++到Azure表的复制/粘贴在其中插入了一些错误的字符——不知道。在“/”字符周围加空格,可能是某种azure转义。我将字符串从azure复制回Visual Studio,然后bam!但更重要的是,我认为你是对的,我更喜欢你的解决方案,将整个文件存储在一个BLOB中,然后从那里进行流式处理,而不必担心格式问题。谢谢你的建议,我同意。