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.exe
Windows 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 キー形式をサポートしています。