16

JGitを使用してリモートGitリポジトリにアクセスしていますが、SSHを使用する必要があります。JGitはJSchを使用して安全なアクセスを提供します。ただし、JGitのキーファイルとknowshostsファイルの設定方法がわかりません。私が試したのは次のとおりです。

JSchConfigSessionFactoryをサブクラス化することにより、 SshSessionFactoryのカスタム構成を作成しました。

public class CustomJschConfigSessionFactory extends JschConfigSessionFactory {
    @Override
    protected void configure(OpenSshConfig.Host host, Session session) {
        session.setConfig("StrictHostKeyChecking", "yes");
    }
}

リモートのGitリポジトリにアクセスするクラスで、次のことを行いました。

CustomJschConfigSessionFactory jschConfigSessionFactory = new CustomJschConfigSessionFactory();

JSch jsch = new JSch();
try {
    jsch.addIdentity(".ssh/id_rsa");
    jsch.setKnownHosts(".ssh/known_hosts");
} catch (JSchException e) {
    e.printStackTrace();  
}
    SshSessionFactory.setInstance(jschConfigSessionFactory);

このJSchオブジェクトをJGitに関連付けて、リモートリポジトリに正常に接続できるようにする方法がわかりません。JGitでクローンを作成しようとすると、次の例外が発生します。

org.eclipse.jgit.api.errors.TransportException: git@git.test.com:abc.org/test_repo.git: reject HostKey: git.test.com
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:137)
at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:178)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:125)
at GitTest.cloneRepo(GitTest.java:109)
at GitTest.main(GitTest.java:223)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: org.eclipse.jgit.errors.TransportException: git@git.test.com:abc.org/test_repo.git: reject HostKey: git.test.com
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:142)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:121)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:248)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:147)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:136)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:122)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1104)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:128)
... 9 more
Caused by: com.jcraft.jsch.JSchException: reject HostKey: git.test.com
at com.jcraft.jsch.Session.checkHost(Session.java:748)
at com.jcraft.jsch.Session.connect(Session.java:321)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:116)
... 16 more

git.test.comエントリを/etc/hostsファイルに追加しました。同じコードを使用してhttpurlを使用してgitリポジトリにアクセスしたので、コードは正常に機能します。失敗しているのはキー処理部分です。これを処理する方法について何かアイデアはありますか?

4

3 に答える 3

14

getJSchカスタムファクトリクラスのメソッドをオーバーライドする必要があります。

class CustomConfigSessionFactory extends JschConfigSessionFactory
{
    @Override
    protected JSch getJSch(final OpenSshConfig.Host hc, FS fs) throws JSchException {
        JSch jsch = super.getJSch(hc, fs);
        jsch.removeAllIdentity();
        jsch.addIdentity( "/path/to/private/key" );
        return jsch;
    }
}

電話をかけるjsch.removeAllIdentityことは重要です。それなしでは機能しないようです。

警告:私は上記をScalaで作成し、それをJavaに変換したので、正しくない可能性があります。オリジナルのScalaは次のとおりです。

class CustomConfigSessionFactory extends JschConfigSessionFactory
{
    override protected def getJSch( hc : OpenSshConfig.Host, fs : FS ) : JSch =
    {
        val jsch = super.getJSch(hc, fs)
        jsch.removeAllIdentity()
        jsch.addIdentity( "/path/to/private/key" )
        jsch
    }
}
于 2013-11-12T13:53:54.147 に答える
6

Jschは、ハッシュ形式のknown_hostsファイルが気に入らないと考えています。次の形式に準拠している必要があります。

ssh-keyscan -t rsa hostname >> ~/.ssh/known_hosts

例えば

<hostname> ssh-rsa <longstring/longstring>

いいえ:

 |1|<hashed hostname>= ecdsa-sha2-nistp256 <hashed fingerprint>=
于 2016-05-11T17:30:29.670 に答える
5

なんとか問題を見つけることができました。サーバー側の公開鍵は通常のid_rsa.pubとは異なる名前でしたが、私の側の秘密鍵はid_rsaでした。JSchは、デフォルトで、公開鍵が秘密鍵と同じ名前に.pubサフィックスを加えたものであると想定しています。共通名(例:private=key_1およびpublic=key_1.pub)の鍵ペアを使用すると、問題が解決します。

于 2012-12-05T07:55:44.620 に答える