Как преобразовать закрытый ключ OpenSSH в закрытый ключ RSA в Java? - PullRequest
0 голосов
/ 05 июля 2019

У меня есть файл закрытого ключа в формате OpenSSH:

-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----

, но мне нужен его в формате RSA:

-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

На терминале я бы сделал это:

ssh-keygen -p -m PEM -f my-openssh-file

но мне нужно сделать это на Java.

Я пытался использовать org.bouncycastle.openssl.PEMWriter, но я не могу понять, как преобразовать мой ключ ввода (какстрока ввода) в объект PrivateKey, который может быть передан в PEMWriter.

1 Ответ

2 голосов
/ 06 июля 2019

Это на самом деле возможно с Maverick Synergy Java SSH API .

Эта новая ветвь наших SSH API поддерживает новый формат файла закрытого ключа OpenSSH, поэтому вы можете загрузить новый ключ и преобразовать его в старый формат PEM, поддерживаемый BouncyCastle.

Вам понадобитсяследующие зависимости maven:

    <dependency>
        <groupId>com.sshtools</groupId>
        <artifactId>maverick-synergy-client</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>com.sshtools</groupId>
        <artifactId>maverick-bc</artifactId>
        <version>3.0.0-SNAPSHOT</version>
    </dependency>

Вам также понадобится следующий репозиторий моментальных снимков, поскольку в настоящее время нет официального выпуска API:

    <repository>
        <id>oss-snapshots</id>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </repository>

Сначала вы можете загрузить новыйФормат закрытого ключа OpenSSH с использованием:

SshKeyPair key = SshKeyUtils.getPrivateKey(
          new File("id_rsa"), "passphrase");

Затем вы можете преобразовать его, передав его в более старую реализацию формата и извлекая текст с помощью метода getFormattedKey.

System.out.write(new OpenSSHPrivateKeyFileBC(
          key, "passphrase").getFormattedKey());

Как немногоИсходя из этого ответа и заявляя, что я являюсь разработчиком рекомендованного проекта, Maverick Synergy - это API третьего поколения, унаследованный от коммерческих API J2SSH Maverick и Maverick Legacy.Maverick Synergy полностью доступна как продукт с открытым исходным кодом, лицензированный по лицензии LGPL.

...