JSch 使用時に「無効な秘密鍵」が表示される 質問する

JSch 使用時に「無効な秘密鍵」が表示される 質問する

Java アプリケーションで Git を操作するために次のコードを使用しています。有効なキーがあり (常に使用しています)、この特定のコードは以前は同じキーと Git リポジトリで動作していましたが、現在は次の例外が発生します。

無効な秘密鍵: [B@59c40796。

この行:

jSch.addIdentity("<key_path>/private_key.pem");

私の完全なコード:

    String remoteURL = "ssh://git@<git_repository>";
    TransportConfigCallback transportConfigCallback = new SshTransportConfigCallback();
    File gitFolder = new File(workingDirectory);
    if (gitFolder.exists()) FileUtils.delete(gitFolder, FileUtils.RECURSIVE);

    Git git = Git.cloneRepository()
            .setURI(remoteURL)
            .setTransportConfigCallback(transportConfigCallback)
            .setDirectory(new File(workingDirectory))
            .call();
}


private static class SshTransportConfigCallback implements TransportConfigCallback {
    private final SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
        @Override
        protected void configure(OpenSshConfig.Host hc, Session session) {
            session.setConfig("StrictHostKeyChecking", "no");
        }

        @Override
        protected JSch createDefaultJSch(FS fs) throws JSchException {
            JSch jSch = super.createDefaultJSch(fs);
            jSch.addIdentity("<key_path>/private_key.pem");

            return jSch;
        }
    };

オンラインで検索した後、createDefaultJSch を pemWriter を使用するように変更しました。

@Override
protected JSch createDefaultJSch(FS fs) throws JSchException {
    JSch jSch = super.createDefaultJSch(fs);
    byte[] privateKeyPEM = null;

    try {
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        List<String> lines = Files.readAllLines(Paths.get("<my_key>.pem"), StandardCharsets.US_ASCII);
        PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(String.join("", lines)));
        RSAPrivateKey privKey = (RSAPrivateKey) keyFactory.generatePrivate(privSpec);

        PKCS8Generator pkcs8 = new PKCS8Generator(privKey);

        StringWriter writer = new StringWriter();
        PemWriter pemWriter = new PemWriter(writer);
        pemWriter.writeObject(pkcs8);

        privateKeyPEM = writer.toString().getBytes("US-ASCII");

    } catch (Exception e) {
        e.printStackTrace();
    }

    jSch.addIdentity("git", privateKeyPEM, null, null);

    return jSch;
}

しかし、まだ「無効な秘密鍵」例外。

ベストアンサー1

OpenSSHの最新バージョン(7.8以降)では、新しいデフォルトでは OpenSSH 形式であり、次のように始まります:

-----BEGIN OPENSSH PRIVATE KEY-----

JSch はこのキー形式をサポートしていません。


使用できますssh-keygenキーをクラシックOpenSSH 形式:

ssh-keygen -p -f <privateKeyFile> -m pem -P passphrase -N passphrase

これは「悪用」-p(パスフレーズの変更)コマンドです。オプションで指定された秘密鍵ファイルを、-f新しい秘密鍵で上書きします。クラシックOpenSSH 形式 ( pem)。現在のパスフレーズを新しいパスフレーズとして保持できます。キーがパスフレーズで暗号化されていない場合は、""の代わりにを使用します。その後、 を使用して公開キーを比較し、既存の公開キーが新しい形式の秘密キーで機能することを確認passphraseできます。ssh-keygen -y -e -f <privateKeyFile> >temp.pub

Windowsユーザーの場合:ssh-keygen.exeWindows 10/11には組み込み機能が搭載されています。Microsoft Win32-OpenSSH プロジェクトからダウンロード古いバージョンの Windows の場合。


Windowsでは、PuTTYgen(PuTTY パッケージ):

  • PuTTYgenを起動する
  • キーをロードする
  • へ移動変換 > OpenSSH キーのエクスポート
    RSAキーの場合は、クラシックフォーマット。

で新しいキーを作成する場合はssh-keygen-m PEM新しいキーを生成するにはクラシックフォーマット:

ssh-keygen -m PEM

実際、オリジナルの JSch はもう積極的にメンテナンスされていないようです。特に、新しいプロジェクトを開始する場合、最初に使用するライブラリとしては最適ではないかもしれません。JSch は最近多くの互換性の問題を抱えています。重要な問題のいくつかについては、以下を参照してください。

代わりに、次の JSch フォークの使用を検討してください。
https://github.com/mwiede/jsch

とりわけ、新しい OpenSSH キー形式をサポートしています。

おすすめ記事