2017-01-08 3 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); 

Эти потерпеть неудачу с "Invalid Private Key".

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>")); 

Я даже попробовал позицию потока, как найти на 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; 
    } 

`

я был в первый думать библиотеку Renci была ошибка с потоком, но очевидно, файловый поток работает. Я планирую разместить ключ в строчном формате в лазурной таблице хранения, но я открыт для других идей.

ответ

3

Согласно вашему описанию, я сгенерировал файл личного ключа с SSH с помощью PuTTYgen и преобразовал свой ключ в формат OpenSSH, обратившись к этому tutorial. На основании кода вы предоставили об использовании 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 Web App, вы может использовать app settings для хранения пар ключ-значение, которые могут быть автоматически загружены и переопределены существующими настройками приложения в файле web.config во время выполнения.

Кроме того, вы можете использовать Azure Blob storage хранить файл закрытого ключа в частном порядке и получить его следующим образом:

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

Примечание: Вы можете следить в разделе «Шифрование блоб данных» в этом tutorial для шифрования ваши данные blob как на стороне клиента, так и на стороне сервера.

Кроме того, вы можете использовать Azure Key Vault для хранения секретного ключа. Более подробно вы можете обратиться к этому официальному лицу document для начала работы с Azure Key Vault.

+0

Я думаю, что я был настолько ослеплен этим, ваша элементарная отладочная вещь помогла - моя голова была настолько глубока в проблеме, что я забыл основные детали отладки. По какой-то причине копирование/вставка из таблицы Notepad ++ в Azure вставляло в нее некоторые странные символы - не знаю.Поместите пробелы вокруг символа «/», возможно, какой-то тип лазурного побега. Я скопировал строку обратно с лазурного на Visual Studio и bam! Но большая часть Я думаю, что вы правы, и мне нравится ваше решение, чтобы лучше хранить весь файл в BLOB и передавать его оттуда, а не беспокоиться о форматировании. Спасибо за эту идею, я пойду с этим. – scimino

Смежные вопросы