2012-12-03 2 views
13

원격 진렛 저장소에 액세스하기 위해 JGit을 사용하고 있으며 SSH을 사용해야합니다. JGit은 JSch을 사용하여 보안 액세스를 제공합니다. 그러나 JGit 용 키 파일 및 알고있는 호스트 파일을 설정하는 방법을 잘 모르겠습니다. 내가 시도한 것은 다음과 같다. JIT와 함께 키를 사용하여 Git 저장소에 안전하게 액세스

JSchConfigSessionFactory를 서브 클래스로 사용하여 SshSessionFactory의 사용자 지정 구성을 만든 :

I 원격 힘내의 repo에 액세스 클래스에서
public class CustomJschConfigSessionFactory extends JschConfigSessionFactory { 
    @Override 
    protected void configure(OpenSshConfig.Host host, Session session) { 
     session.setConfig("StrictHostKeyChecking", "yes"); 
    } 
} 

은 다음했다 :

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과 연결하여 원격 저장소에 성공적으로 연결할 수있는 방법을 찾아보십시오. 내 /etc/hosts 파일로 git.test.com 항목을 추가 한

org.eclipse.jgit.api.errors.TransportException: [email protected]: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: [email protected]: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 

: 나는 JGit로 복제 할 때, 나는 다음과 같은 예외를 얻을. HTTP URL을 사용하여 자식 repo에 액세스 할 때 동일한 코드를 사용 했으므로 코드가 제대로 작동합니다. 그것은 중요한 핸들링 부분입니다. 이 문제를 어떻게 처리 할 수 ​​있을지에 대한 아이디어가 있습니까?

답변

3

관리되는 문제. 서버 측의 공개 키는 일반적인 id_rsa.pub가 아닌 다른 이름을 가지고있는 반면, 내 측면의 개인 키는 id_rsa였습니다. JSch는 기본적으로 공개 키가 개인 키와 .pub 접미사를 더한 이름을 가질 것으로 예상합니다. 일반 이름 (예 : private = key_1 및 public = key_1.pub)이있는 키 쌍을 사용하면 문제가 해결됩니다.

11

당신은 사용자 정의 공장 클래스의 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이 중요 호출; 그것 없이는 작동하지 않는 것 같습니다.

주의 사항 : 위의 내용을 스칼라에서 작성한 다음 Java로 변환하여 올바르지 않을 수 있습니다.

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

예 : 그것은에 의해 생성 된 형식을 준수해야합니다 format--

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 
    } 
} 
+1

내 문제는 당신이 addIdentity''또 다른 매개 변수로 추가 할 수 있습니다 개인 키, 또는 당신의 자신을 만들어 암호를 지정할 수 필요가 있다고했다 'UserInfo'를 구현하고'session' 매개 변수를'CustomConfigSessionFactory'의'configure' 메쏘드로 설정하여'UserInfo'를 사용하는 클래스입니다. – WhiteKnight

+2

'jsch.removeAllIdentity()'힌트를 보내 주셔서 감사합니다! – Vincent

4

Jsch는 sesems 해시에서에서 known_hosts 파일을 같이하지 않는 다음과 같이 원래의 스칼라입니다

<hostname> ssh-rsa <longstring/longstring> 

하지 :

|1|<hashed hostname>= ecdsa-sha2-nistp256 <hashed fingerprint>= 
관련 문제