2017-01-08 58 views
2

我正在使用Renci.SshNet库,并使用用户名和私钥工作。当从文件或文件流中读取私钥时,我可以将私钥打开,但在内存流中失败。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 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>")); 

我甚至试过流位置上,从而发现:

`private Stream GenerateStreamFromString(string s) 
    { 
     MemoryStream stream = new MemoryStream(); 
     StreamWriter writer = new StreamWriter(stream); 
     writer.Write(s); 
     writer.Flush(); 
     stream.Position = 0; 
     return stream; 
    } 

`

我起初想的Renci文库与流中的错误,但很明显,文件流作品。我计划在一个天蓝色的存储表格中以字符串格式存储密钥,但我愿意接受其他想法。

回答

3

根据您的描述,我通过使用PuTTYgen使用SSH生成了我的私钥文件,并通过参考此tutorial将我的密钥转换为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应用程序,你的Web应用程序可以利用app settings来存储可自动加载的键值对,并在运行时覆盖web.config文件中的现有appsetting。

此外,您可以利用Azure Blob storage来存储您的私钥文件在私人和检索,如下所示:

using(var ms=new MemoryStream()) 
{ 
    cloudBlockBlob.DownloadToStream(ms); 
    var pk = new PrivateKeyFile(ms, "{password}"); 
} 

注:你可以按照“加密blob数据”部分在此tutorial加密您在客户端和服务器端的blob数据。

此外,您可以利用Azure Key Vault来存储您的私钥。更多细节,您可以参考官方document获取Azure密钥保管库入门。

+0

我觉得我对此很盲目,你的初级调试帮助 - 我的脑袋深陷在问题中,我忘记了基本的调试细节。出于某种原因,从Notepad ++复制/粘贴到Azure表中会插入一些错误的字符 - 不知道。在“/”字符周围放置空格,可能是某种类型的天蓝色逃逸。我将字符串从azure复制到Visual Studio和bam! 但是,我认为你是对的,我更喜欢你的解决方案,将整个文件存储在一个BLOB中,并从那里进行流式传输,而不用担心格式化。感谢这个想法,我正在为此而努力。 – scimino