Как работать с OPENSSH PRIVATE KEY в Java? - PullRequest
3 голосов
/ 09 апреля 2019

Я генерирую ключ DSA с помощью следующей команды:

ssh-keygen -t dsa

Затем я пытаюсь подписать данные, используя API-интерфейс bouncycastle:

    KeyFactory keyFactory = KeyFactory.getInstance("DSA");
    String privateKeyContent = // the content of the generated file

    //init privateKey
    byte[] pemContent = null;
    PEMParser pemParser = new PEMParser(new StringReader(privateKeyContent));
    Object pemObject = pemParser.readObject(); // throws

И получаю это исключение

java.io.IOException: нераспознанный объект: OPENSSH PRIVATE KEY

Итак, я пытался преобразовать файл ключа в PEM, используя этот пример и выполняя:

ssh-keygen -e -f key -m PEM > key.pem

Но я получаю сообщение об ошибке:

do_convert_to_pem: unsupported key type DSA

Есть идеи, как это решить?

1 Ответ

2 голосов
/ 09 апреля 2019

Здесь происходит несколько вещей.

  1. Вы генерируете ключи, используя довольно свежую версию OpenSSH (что хорошо).Теперь они выводятся в новом формате ключей OpenSSH, который API-интерфейс BouncyCastle не распознает в качестве пользовательского формата.

  2. Вы генерируете ключ DSA.OpenSSH отказался от использования DSA, поскольку он не считается таким безопасным, как другие типы закрытых ключей, предоставляемые, например, RSA, ECDSA, ED25519 и т. Д. Так что он позволяет генерировать ключ;это не позволяет вам преобразовать его.

Я бы рекомендовал изменить тип ключа на ключ RSA с 2048 битами (минимум).Это, однако, не остановит ошибку API BouncyCastle, потому что она все еще будет в новом формате OpenSSH.

Это действительно зависит от того, что вы делаете с ключом.Если вы не используете его в API-интерфейсе SSH для аутентификации на удаленных серверах и просто хотите подписать данные с помощью API BouncyCastle, тогда вам лучше сгенерировать ключ с помощью OpenSSL с помощью команды

openssl genrsa -out private.pem 2048

Этот ключ должен затембыть признанным API BouncyCastle.

...