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

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

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

Bitbucket возвращает 400 Bad Request, когда я ОТПРАВЛЯЮ 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 [email protected]
 failed
/Users/dc/Desktop/dummy_rsa.pub is not a public key file.

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


person davidchambers    schedule 12.11.2011    source источник
comment
Вы не можете раскошелиться, чтобы сгенерировать ключ, но можете ли вы сделать запрос AJAX из браузера, чтобы получить сгенерированный (или действительный) ключ SSH с сервера?   -  person John K    schedule 12.11.2011
comment
@JohnK Если необходимо, да. Я прокси-запросы через легкое приложение Sinatra, хотя я бы предпочел, чтобы это было не более чем посредником, если это вообще возможно.   -  person davidchambers    schedule 12.11.2011


Ответы (2)


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

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

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

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

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

person Strelok    schedule 12.11.2011
comment
эти ссылки битые - person OLIVER.KOO; 11.04.2019

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

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

person John K    schedule 12.11.2011
comment
Спасибо, Джон. Идеал? Неа. Прагматично? Определенно. - person davidchambers; 12.11.2011