配置Jenkins SSH-slave Docker镜像时遇‘Server rejected the 1 private key’错误求助
我在Ubuntu系统上用jenkins/jenkins:lts和jenkins/ssh-slave镜像部署Jenkins主从容器,操作步骤如下:
- 进入Jenkins主节点容器终端:
docker exec -it container_id bash,运行ssh-keygen生成SSH密钥 - 通过Dockerfile将生成的公钥添加到SSH-slave容器的
authorized_keys文件中 - 按指引将私钥添加到Jenkins凭据中
但在配置后遇到了SSH认证失败的错误,日志如下:
[02/08/19 20:31:06] [SSH] Opening SSH connection to ###.##.#.#:22.
[02/08/19 20:31:06] [SSH] SSH host key matches key in Known Hosts file. Connection will be allowed.
ERROR: Server rejected the 1 private key(s) for jenkins (credentialId:worker-ssh/method:publickey)
[02/08/19 20:31:06] [SSH] Authentication failed. Authentication failed.
[02/08/19 20:31:06] Launch failed - cleaning up connection
[02/08/19 20:31:06] [SSH] Connection closed.
我的Jenkins从节点模板配置:
- 名称:jenkins-worker
- 使用方式:尽可能使用此节点
- 启动方式:通过SSH启动代理
- 主机名:从
ifconfig获取的IP地址 - 主机密钥验证策略:已知主机文件验证策略(
.ssh/known_hosts包含对应主机IP条目)
SSH-slave的Dockerfile内容:
#Docker version 18.09.1 FROM jenkins/ssh-slave COPY /.ssh/id_rsa.pub /.ssh/authorized_keys RUN chmod 744 /.ssh/authorized_keys
我之前也踩过这个SSH认证的坑,咱们一步步来修复:
1. 修正Dockerfile中的权限问题
SSH对authorized_keys和.ssh目录的权限要求非常严格,你的Dockerfile里的权限设置不对:
.ssh目录必须设置为700(只有所有者能读写执行)authorized_keys必须设置为600(只有所有者能读写)
修改后的Dockerfile应该是这样:
#Docker version 18.09.1 FROM jenkins/ssh-slave # 先创建目录并设置权限,避免镜像中目录权限异常 RUN mkdir -p /.ssh && chmod 700 /.ssh COPY /.ssh/id_rsa.pub /.ssh/authorized_keys RUN chmod 600 /.ssh/authorized_keys
2. 确保主节点密钥是用jenkins用户生成的
进入主节点容器时,默认用户是root吗?如果是,你生成的密钥属于root用户,但Jenkins服务是用jenkins用户运行的,会导致权限不足无法读取私钥。
正确的生成步骤应该是:
# 进入容器后切换到jenkins用户 docker exec -it container_id su jenkins # 生成密钥,一路回车默认设置即可 ssh-keygen -t rsa -b 4096 -C "jenkins-master@container" # 复制公钥到本地,用于构建slave镜像 docker cp container_id:/var/jenkins_home/.ssh/id_rsa.pub ./
3. 检查Jenkins凭据配置
添加私钥到Jenkins凭据时,要注意这几点:
- 选择SSH Username with private key类型
- 用户名填
jenkins(因为jenkins/ssh-slave镜像的默认用户就是jenkins) - 私钥要完整复制:包括开头的
-----BEGIN RSA PRIVATE KEY-----和结尾的-----END RSA PRIVATE KEY-----,不能有遗漏或多余的空格
4. 验证密钥配对
可以在主节点容器里用jenkins用户手动测试SSH连接,确认密钥是否有效:
# 切换到jenkins用户 su jenkins # 尝试连接slave节点,替换为你的slave IP ssh jenkins@###.##.#.#
如果能成功连接,说明密钥没问题,再去Jenkins里重新触发代理启动即可。
内容的提问来源于stack exchange,提问作者bot

