Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java USERAUTH无法使用JGit安全地访问PullCommand()的git repo_Java_Git_Authentication_Jsch_Jgit - Fatal编程技术网

Java USERAUTH无法使用JGit安全地访问PullCommand()的git repo

Java USERAUTH无法使用JGit安全地访问PullCommand()的git repo,java,git,authentication,jsch,jgit,Java,Git,Authentication,Jsch,Jgit,我正在尝试使用JGit的API和以下代码进行git拉 public class gitHubTest { JSch jsch = new JSch(); // Defining the private key file location explicitly String userHome = System.getProperty("user.home"); String privateKey = userHome + "/.ssh/id_rsa"; S

我正在尝试使用JGit的API和以下代码进行git拉

public class gitHubTest {
    JSch jsch = new JSch();

    // Defining the private key file location explicitly
    String userHome = System.getProperty("user.home");
    String privateKey = userHome + "/.ssh/id_rsa";
    String knownHostsFile = userHome + "/.ssh/known_hosts";
    Repository localRepo = new FileRepository("/LocalPath/.git");

    public gitHubTest() throws Exception {
        jsch.setConfig("StrictHostKeyChecking", "no");
        jsch.setKnownHosts(knownHostsFile);
        jsch.addIdentity(privateKey);
        System.out.println("privateKey :" + privateKey);
        Git git = new Git(localRepo);
        PullCommand pullcmd = git.pull();
        pullcmd.call();
    }
}
错误堆栈跟踪:

org.eclipse.jgit.api.errors.TransportException: git@github.example.com:remote.git: USERAUTH fail
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:245)
at org.eclipse.jgit.api.PullCommand.call(PullCommand.java:288)
at gitHubTest.<init>(gitHubTest.java:47)
at WebhooksServer.main(WebhooksServer.java:13)
Caused by: org.eclipse.jgit.errors.TransportException: git@github.example.com:remote.git: USERAUTH fail
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:160)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:137)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:274)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:169)
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:1236)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:234)
... 3 more

Caused by: com.jcraft.jsch.JSchException: USERAUTH fail
at com.jcraft.jsch.UserAuthPublicKey.start(UserAuthPublicKey.java:119)
at com.jcraft.jsch.Session.connect(Session.java:470)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:117)
... 10 more

这也会产生同样的错误。

我可以找出我所面临的一些问题。以下是解决方案:

  • 如果必须在不使用密码短语的情况下进行身份验证,则生成不使用密码短语的id_rsa

  • 我们需要覆盖
    getJSch(final OpenSshConfig.Host hc,FS FS)
    在sshsSessionFactory的配置中使用附加属性:

    SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
        @Override
        protected void configure(OpenSshConfig.Host host, Session sess ion) {
            session.setConfig("StrictHostKeyChecking", "no");
        }
    
        @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;
        }
    };
    
  • 我们需要调用不同的实例:

    PullCommand pull = git.pull().setTransportConfigCallback(new TransportConfigCallback() {
    
        @Override
        public void configure(Transport transport) {
            SshTransport sshTransport = (SshTransport) transport;
            sshTransport.setSshSessionFactory(sshSessionFactory);
        }
    });
    
  • 然后调用拉实例:

    PullResult pullResult = pull.call();
    

    我希望这能有所帮助。

    我能找出我所面临的一些问题。以下是解决方案:

  • 如果必须在不使用密码短语的情况下进行身份验证,则生成不使用密码短语的id_rsa

  • 我们需要覆盖
    getJSch(final OpenSshConfig.Host hc,FS FS)
    在sshsSessionFactory的配置中使用附加属性:

    SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
        @Override
        protected void configure(OpenSshConfig.Host host, Session sess ion) {
            session.setConfig("StrictHostKeyChecking", "no");
        }
    
        @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;
        }
    };
    
  • 我们需要调用不同的实例:

    PullCommand pull = git.pull().setTransportConfigCallback(new TransportConfigCallback() {
    
        @Override
        public void configure(Transport transport) {
            SshTransport sshTransport = (SshTransport) transport;
            sshTransport.setSshSessionFactory(sshSessionFactory);
        }
    });
    
  • 然后调用拉实例:

    PullResult pullResult = pull.call();
    

    我希望这会有所帮助。

    您在CLI Git上也尝试过同样的方法吗?结果是什么?在哪里声明了
    jsch
    ,它如何与
    PullCommand
    交互?您似乎试图将git协议与SSH身份验证结合使用,这两者如何配合?代码段没有覆盖
    configure()
    ,请发布一个最小但完整的代码段来重现问题。@Rüdigerhmann感谢您的回复。我已经在下面的答案中发布了代码片段。您需要清楚服务器需要什么形式的协议和身份验证。您是否使用GitHub(私有、公共、内部)?Git服务器在URL中表示用户名的位置不同。再次尝试使用CLI Git。顺便说一句,您的
    CredentialsProvider
    实现不会返回任何有用的内容。如果它被实际调用(使用调试器),这可能是身份验证失败的原因。我使用的是私有GitHub。请将我重定向到使用基于默认私钥~/.ssh.id_rsa的身份验证的示例代码。您是否在CLI Git中尝试过相同的方法?结果是什么?在哪里声明了
    jsch
    ,它如何与
    PullCommand
    交互?您似乎试图将git协议与SSH身份验证结合使用,这两者如何配合?代码段没有覆盖
    configure()
    ,请发布一个最小但完整的代码段来重现问题。@Rüdigerhmann感谢您的回复。我已经在下面的答案中发布了代码片段。您需要清楚服务器需要什么形式的协议和身份验证。您是否使用GitHub(私有、公共、内部)?Git服务器在URL中表示用户名的位置不同。再次尝试使用CLI Git。顺便说一句,您的
    CredentialsProvider
    实现不会返回任何有用的内容。如果它被实际调用(使用调试器),这可能是身份验证失败的原因。我使用的是私有GitHub。请将我重定向到一个示例代码,该代码使用基于默认私钥~/.ssh.id\u rsa的身份验证。很高兴您找到了解决方案。请编辑您的答案以提高可读性,以便在找到解决方案后对其他人有用。请编辑您的答案以提高可读性,以便对其他人有用