Генерировать правильно сформированный SSH-ключ в JavaScript

#javascript #ssh-keys #bitbucket-api

#javascript #ssh-ключи #bitbucket-api

Вопрос:

Я разрабатываю оболочку Bitbucket API на JavaScript. Я пытаюсь написать тесты для метода, который добавляет SSH-ключ. Моя наивная попытка создать правдоподобный SSH-ключ оказалась неудачной. Вот как я сгенерировал фиктивный ключ:

  1. начните с «ssh-rsa»
  2. добавьте представление в кодировке Base64 строки из 279 символов, состоящей из случайных символов
  3. добавить » «
  4. добавьте 16-символьную строку из случайных символов
  5. добавить «@»
  6. добавьте 16-символьную строку из случайных символов
  7. добавьте «.com»

Bitbucket возвращает 400 неверных запросов, когда я отправляю SSH-ключ, сгенерированный таким образом. К счастью, у меня есть доступ к исходному коду Bitbucket, поэтому я смог копнуть немного глубже. Bitbucket проверяет SSH-ключи, прогоняя их через ssh-keygen .

Я не понимаю, как генерируются SSH-ключи, поэтому, возможно, я задаю глупый вопрос. Возможно ли сгенерировать SSH-ключ, достаточно убедительный, чтобы обмануть ssh-keygen ? Вот результат:

 $ ssh-keygen -l -f ~/Desktop/dummy_rsa.pub 
buffer_get_string_ret: bad string length 1903654498
key_from_blob: can't read key type
key_read: key_from_blob cXd2YnRzZXpha3Rld2V4YmdieWdoeWl2aXpla3hkaHBodnlteHl2ZHl0bnloYmRyYWZrdnVxaWR3cHBydnFmZWFkaHp0aGRwYml6ZXVxY3ZlZ3NiZ29lanl0cG9vZmlnZ2dyZmJ3aWxsdXJhb2puYWRjY3F0YW5rcGV3Z3dkc3lxd2tkb3d6emFzbXpubXJ1eGN2bm53a3l6bmRjenV1dnplbnFtZ3Z5bm96ZGZhandwcG9mcHVoaWFkZ25ud3VkdnB0enV6Zm51bWVxanhzanlwa2ZodGxpd2xld2pnY3dhbmJ6aXVyamp6c29rbm54dHp2enJmeWhnY2ZrcWlqemFscGNnbWJsY3lpcmRtYXFkbHB6c3l0 duvrnzsladfrmccr@xqrbenpfryhoklgw.com
 failed
/Users/dc/Desktop/dummy_rsa.pub is not a public key file.
  

Чтобы было понятно, мне не нужно генерировать «действительный» SSH-ключ, мне просто нужно иметь возможность тестировать различные конечные точки API. Кроме того, поскольку тесты выполняются в браузере, я не могу раскошелиться на генерацию ключа.

Комментарии:

1. Вы не можете «раскошелиться» на генерацию ключа, но можете ли вы сделать AJAX-запрос из браузера для извлечения сгенерированного (или действительного) SSH-ключа с сервера?

2. @JohnK Если необходимо, да. Я проксирую запросы через легкое приложение Sinatra, хотя я бы предпочел не делать его чем-то большим, чем посредник, если это вообще возможно.

Ответ №1:

SSH-ключи — это не просто случайные строки символов, поэтому они не проходят проверку.

Эта библиотека, здесь называемая Javascript Cryptography Toolkit, может помочь вам сгенерировать ключи RSA (используемые SSH).

У них есть демонстрация генерации ключа: https://github.com/ats4u/titaniumcore/blob/master/crypto/RSA.sample1.html

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

обновление 2019 года: обновлены ссылки на github.

Комментарии:

1. эти ссылки не работают

Ответ №2:

Если в конечном итоге вы выполняете AJAX-вызов существующего облегченного приложения Ruby Sinatra для генерации и извлечения SSH-ключа, вы можете использовать для этого драгоценный камень sshkey https://rubygems.org/gems/sshkey

Это не дает ответа на вопрос, как это сделать в чистом JavaScript, но предоставляет альтернативный путь, основанный на вашей конкретной архитектуре приложения (см. Комментарии под вопросом).

Комментарии:

1. Спасибо, Джон. Идеально? Нет. Прагматично? Определенно.