Teamcity SSH私钥登录失败:私钥无效

时间:2014-02-20 09:49:16

标签: ssh teamcity jsch teamcity-8.0

我设置SSH登录,从Windows Agent连接到Linux,但TeamCity出现以下错误。

  

[新构建问题] com.jcraft.jsch.JSchException:无效的私钥:[B @ 5543cd

SSH Secure Shell生成的密钥对连接服务器没有问题。

类似的问题是here,但这不是我的程序化问题,而是团队城市内部异常。

请注意,我的问题不是GitHub VCS连接问题。我的Windows TeamCity Agent与CentOS Linux服务器之间存在问题。

完整的堆栈跟踪如下所示。

  

[步骤6/8] com.jcraft.jsch.JSchException:无效私有密钥:[com @ jcraft.jsch.KeyPair.load(KeyPair.java:702)的B @ 5543cd,位于com.jcraft.jsch.KeyPair。加载(KeyPair.java:542)com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)com.jcraft.jsch.JSch.addIdentity(JSch.java:389)com.jcraft.jsch.JSch .addIdentity(JSch.java:349)at jetbrains.buildServer.deployer.agent.ssh.SSHSessionProvider.initSessionKeyFile(SSHSessionProvider.java:110)at jetbrains.buildServer.deployer.agent.ssh.SSHSessionProvider。(SSHSessionProvider.java:80) at jetbrains.buildServer.deployer.agent.ssh.SSHExecRunner.createBuildProcess(SSHExecRunner.java:26)at jetbrains.buildServer.agent.impl.runner.CallRunnerService.doCreateBuildProcess(CallRunnerService.java:71)at jetbrains.buildServer.agent.impl .runner.CallRunnerService.createBuildProcess(CallRunnerService.java:47)at jetbrains.buil上的jetbrains.buildServer.agent.impl.buildStages.runnerStages.start.CallRunnerStage.doBuildStage(CallRunnerStage.java:47) dServer.agent.impl.buildStages.RunnerStagesExecutor $ 1.callStage(RunnerStagesExecutor.java:25)at jetbrains.buildServer.agent.impl.buildStages.RunnerStagesExecutor $ 1.callStage(RunnerStagesExecutor.java:18)at jetbrains.buildServer.agent.impl。 buildStages.StagesExecutor.callRunStage(StagesExecutor.java:78)at jetbrains.buildServer.agent.impl.buildStages.StagesExecutor.doStages(StagesExecutor.java:37)at jetbrains.buildServer.agent.impl.buildStages.RunnerStagesExecutor.doStages(RunnerStagesExecutor。 java:18)at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.RunnerContextExecutor.callRunnerStages(RunnerContextExecutor.java:43)at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.StepExecutor.processNextStep(StepExecutor。 java:25)at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage.executeRunnerStep(ForEachBuildRunnerStage.java:138)at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage.runSte p(ForEachBuildRunnerStage.java:123)at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage.executeBuildRunners(ForEachBuildRunnerStage.java:83)at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage。 doBuildStage(ForEachBuildRunnerStage.java:44)at jetbrains.buildServer.agent.impl.buildStages.BuildStagesExecutor $ 1.callStage(BuildStagesExecutor.java:31)at jetbrains.buildServer.agent.impl.buildStages.BuildStagesExecutor $ 1.callStage(BuildStagesExecutor.java: 24)at jetbrains.buildServer.agent.impl.buildStages.StagesExecutor.callRunStage(StagesExecutor.java:78)at jetbrains.buildServer.agent.impl.buildStages.StagesExecutor.doStages(StagesExecutor.java:37)at jetbrains.buildServer.agent .impl.buildStages.BuildStagesExecutor.doStages(BuildStagesExecutor.java:24)at jetbrains.buildServer.agent.impl.BuildRunAction.doStages(BuildRunAction.java:70)at jetbrains.buildServer.agent.impl.BuildRunAction.runBuild(BuildRunAction.java) :5 0)at jetbrains.buildServer.agent.impl.BuildAgentImpl.doActualBuild(BuildAgentImpl.java:263)at jetbrains.buildServer.agent.impl.BuildAgentImpl.access $ 100(BuildAgentImpl.java:50)at jetbrains.buildServer.agent.impl。 java.lang.Thread.run中的BuildAgentImpl $ 1.run(BuildAgentImpl.java:236)(Thread.java:744)

3 个答案:

答案 0 :(得分:4)

对于每个来这里寻找Teamcity上“无效私钥”解决方案的人,解决方案都是使用以下命令生成密钥:

ssh-keygen -t rsa -m PEM

文档this page中指出了这一点

答案 1 :(得分:1)

最有可能的是,您提供的私钥格式不是JSCH期望的格式(即OpenSSH)。

此处提供了类似的问题和答案: JSCH - Invalid private key

答案 2 :(得分:0)

在花费大量时间并运行正确的命令并得到相同的无效私钥错误之后,我查找了JSch在寻找什么?最终,我找到了这段代码,该代码可以帮助我创建所需的密钥,并且可以连接:

try {
        com.jcraft.jsch.KeyPair pair = com.jcraft.jsch.KeyPair.genKeyPair(new 
        JSch(), com.jcraft.jsch.KeyPair.RSA);
        ByteArrayOutputStream publicKeyOut = new ByteArrayOutputStream();
        ByteArrayOutputStream privateKeyOut = new ByteArrayOutputStream();
        pair.writePublicKey(publicKeyOut, "kamranbhatti");
        pair.writePrivateKey(privateKeyOut);
        String publicKey = new String(publicKeyOut.toByteArray());
        String privateKey = new String(privateKeyOut.toByteArray());
        System.out.println(publicKey);
        System.out.println(privateKey);

    } catch (Exception e) { 

          } 

我将私钥复制到服务器,并且能够连接。