Принимает ли SSH.NET закрытый ключ только в формате OpenSSH? Если нет, то какие ограничения?

В руководстве это не указано, но некоторые поиски в Google выдают страницы начала десятилетия (например, это), предполагая, что это, по крайней мере, раньше имело место. У нас есть такой код:

var privateKeyAuthenticationMethod =
    new PrivateKeyAuthenticationMethod(userName, new PrivateKeyFile(privateKeyLocation));
var connInfo =
    new ConnectionInfo(
        ftpSettings.HostAddress, ftpSettings.UserName, privateKeyAuthenticationMethod);
using (var client = new SftpClient(connInfo))
{
    client.Connect();
    client.UploadFile(memStreamData, destination);
}

Это подключается к закрытому ключу, который мы успешно использовали через SCP2 (Secure Copy 2, как подробно описано здесь) - это 2048 DSA, который указан как действительный в документации SSH.NET. Ключ использует формат ssh.com, например:

---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
Subject: <FID name>
Comment: "2048-bit dsa, <FID name>@<Server name>, Mon Apr 24 201\
 7 15:49:36 +0100"
<ENCRYPTED KEY>
---- END SSH2 ENCRYPTED PRIVATE KEY ----

Однако в части обработки закрытого ключа SSH.NET есть Regex, который не соответствует нашему закрытому ключу и поэтому выдает исключение:

ERROR 2017-05-10 15:31:43 UTC [T: 474] – Invalid private key file.
ERROR 2017-05-10 15:31:43 UTC [T: 474] – at Renci.SshNet.PrivateKeyFile.Open(Stream privateKey, String passPhrase)

Однако он совпадет, если мы преобразуем ключ в формат OpenSSH, но это не обязательно то, что мы можем использовать в производстве из-за бизнес-ограничений.

Кто-нибудь точно знает, какие ограничения на формат закрытого ключа для SSH.NET, пожалуйста? Мы не уверены, нужно ли нам на этот раз отказаться от SSH.NET для какой-то другой библиотеки-оболочки SFTP, написать свою собственную или что-то в этом роде.


person Gravyweg    schedule 11.05.2017    source источник
comment
некоторые страницы в Google возвращаются – Какие страницы? + Что такое SCP2? + Как выглядит ваш файл закрытого ключа? + Какие бизнес-ограничения могут помешать вам использовать ключевой формат, который вам нужен?   -  person Martin Prikryl    schedule 11.05.2017
comment
SCP2 — это Secure Copy 2, инструмент командной строки, обеспечивающий передачу по SFTP. Бизнес-ограничения заключаются в том, что бизнес использует только формат ssh.com — см. ответ на ответ ниже. Страницы включают эту   -  person Gravyweg    schedule 11.05.2017
comment
Откуда взялся SCP2? + бизнес использует только формат ssh.com - это довольно расплывчато. Так почему бы вам просто не преобразовать формат ключа для использования в вашем приложении? + Опять же, как выглядит ваш файл закрытого ключа?   -  person Martin Prikryl    schedule 11.05.2017
comment
SCP2 — (ssh.com/manuals/client-user/44/scp2 .html). Что касается бизнес-требований, SA будут предоставлять ключ только в формате ssh.com. Закрытый ключ выглядит как ответ на вопрос ниже.   -  person Gravyweg    schedule 11.05.2017


Ответы (1)


Как сказано в документации по коду для типа PrivateKeyFile:

Поддерживает закрытый ключ RSA и DSA в формате OpenSSH и ssh.com.


Я сгенерировал новый закрытый ключ ssh.com:

---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
Comment: "dsa-key-20170511"
P2/56wAAA4IAAAAmZGwtbW9kcHtzaWdue2RzYS1uaXN0LXNoYTF9LGRoe3BsYWlufX0AAA
AEbm9uZQAAA0QAAANAAAAAAAAACACOT7SBNaNYmT13gDCCFyE/3yEs6oVbmmGVM6dIesTC
iwY26oHL2JKNLh2gHYfwa9iwDESAH6CIUR+Jf19KXLyNMLQgsoEhfZRS35mDC0pyoYgD77
N2VXt7hkEYFYuJK459HmmoJ2DABdZ9Anb6twDwfY7XhRdLz2H44OOifd1qKjYd/qzsm9MQ
4qUDHYsJpfCly2DFjcFy915fPW4IrTguCRRv545B949iZD/9VcysVe5Cs5DKe1zQybgs2L
qRgMXVS8eHIx4ASNRP6Z9gllkPK2CqWMeLL7P0oR6fNuC8T02xy0CTNh9s041mB7zN5Sfy
kuTzqh6Wkj3t9Z9Fv8YxAAAH/iadRhuaJzO7c9oA4+Z/aPwcTQZQiyeZ0jzTzKUZsyOUiV
PDGxsAuBAcMapskELDdWy0n0S0im4HyxouQrQxqIHBtzucuD4YznIdsCCjs8S0NiBLXEE1
DYyiIpnAgpoC1j6b00L3LosaI2szOAp2fGB2dtXizX6fIkUZssNZthEbpOKGvItor7JUv8
urcbl56S9B+mdyTm/a+zKP+Q5rC9mjd/N6X+9+pZxPoSfEzgclUOLxC+zJigpUEZ9UcqGR
eCT881CKmd0HRrVG3uzgVvsnnzX7wyTnOqg2CXuESB3NvvlzM2Vsa3UuBU1AjBj1++0h5Q
VJ83MZmlp2seG0m3MAAACg22bQYT6jD8GG9XaeoHXwnaPCB8kAAAgAh5QuiehV7IZN9G0R
V4t/sdnhA8M5X7YXw9iQUu08TYmPomZATI/7OlUYySPsjuf5IbRWSKXVP1x2Rku8gJQnAI
lbS6jhxHjx61fwD4jctaCZdI1MzXgW/PtIv3Sc6JyJdnD1dqKieUuRG6PhTFqoG3F1YHyy
VydaIhB1vKi90sTJ5AXXEZG81Q7yRBItJqr46XBz0W4CqQS6aguzzO9ZEdcadJGfDF6Bp8
Ymxzf58lYNrCJem4p7axM7P/9HaNW4xzRb5N0hyBYjFXAFa/mo2jARWHQTGeQy7KbdfUKE
vkxd96qK3InQHijWelnKAT5KgFaM9P1AEsgLnNRlQdn/fwAAAJ4qvy/nqPvqBwotQLLE0I
M9rbFIdA==
---- END SSH2 ENCRYPTED PRIVATE KEY ----

SSH.NET 2016.0.0 PrivateKeyFile может загрузить его без проблем.


Одна вещь с вашим ключом, которую PrivateKeyFile не может обработать, это заголовок Subject:. Убери это.

Если вам нужен неповрежденный ключевой файл, просто удалите его на лету, прочитав:

string key = File.ReadAllText(@"C:\path\key");
Regex removeSubjectRegex = new Regex("Subject:.*[\r\n]+", RegexOptions.IgnoreCase);
key = removeSubjectRegex.Replace(key, "");
MemoryStream buf = new MemoryStream(Encoding.UTF8.GetBytes(key));
PrivateKeyFile privateKeyFile = new PrivateKeyFile(buf);
person Martin Prikryl    schedule 11.05.2017
comment
Спасибо за ваш ответ, но это сбивает с толку, поскольку мы используем формат ssh.com - интересно, не вызвано ли это какой-то другой проблемой... - person Gravyweg; 11.05.2017
comment
Превосходно! Спасибо, Мартин, я действительно могу загрузить ваш ключ, и я понимаю, почему мой не работает — похоже, что строка «Тема» не разрешена, а в строке «Комментарий» есть продолжение строки, где дата превышена — «Пн, 24 апреля 201 \\\r\n7'. Удаление этих двух вещей позволяет этому пройти, и я могу получить с нашими SA и сделать так, чтобы это произошло, я уверен. Спасибо за вашу помощь! - person Gravyweg; 11.05.2017