2017-01-08 96 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