团队城市SSH私钥登录失败:无效的私钥。

6
我设置了SSH登录,从Windows代理连接到Linux的时候,但TeamCity给出了以下错误信息。
[新建构建问题] com.jcraft.jsch.JSchException:无效的私钥:[B@5543cd
由SSH Secure Shell生成的密钥对连接服务器没有问题。
类似的问题在这里here,但这不是我的编程问题,而是teamcity内部异常。
请注意,我的问题不是GitHub VCS连接性问题,只是Windows TeamCity代理和CentOS Linux服务器之间的问题。
完整的堆栈跟踪如下。
[第 6/8 步] com.jcraft.jsch.JSchException:无效的私钥:[B @ 5543cd at com.jcraft.jsch.KeyPair.load(KeyPair.java:702)at com.jcraft.jsch.KeyPair.load(KeyPair.java:542)at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)at com.jcraft.jsch.JSch.addIdentity(JSch.java:389)at 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.buildServer.agent.impl.buildStages.runnerStages.start.CallRunnerStage.doBuildStage(CallRunnerStage.java:47)at jetbrains.buildServer.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.runStep(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:50)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.BuildAgentImpl $ 1.run(BuildAgentImpl.java:236)at java.lang.Thread.run(Thread.java:744)

你能否编辑你的问题,具体描述一下你是如何生成这个密钥的,以及你设置Teamcity读取密钥的具体文件是哪个? - Kenster
3个回答

13

对于在Teamcity上寻找“无效私钥”解决方案的所有人,解决方法是使用以下命令生成密钥:

ssh-keygen -t rsa -m PEM

这在文档的此页面中指出。


这个完美的解决方案对我很有帮助。你应该得到正确的答案 :) - Christian Müller

1
很可能,您提供的私钥格式不是JSCH所期望的格式(即OpenSSH)。
类似的问题和答案在这里提供: JSCH - 无效的私钥

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) { 

          } 

我把私钥复制到了服务器,然后成功连接了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接