在Jenkins中使用SSH密钥时,不需要直接将私钥文件传递到Jenkins服务器,而是通过Jenkins的凭证管理功能安全地存储和使用私钥。以下是关键步骤和注意事项:
1. 生成SSH密钥对
- 在Jenkins服务器(或任意客户端)上生成密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 私钥默认保存在
~/.ssh/id_rsa
,公钥在~/.ssh/id_rsa.pub
。 - 无需以Jenkins用户身份生成密钥,但需确保Jenkins运行用户(如
jenkins
)有权限读取私钥文件(如果选择文件存储方式)。
- 私钥默认保存在
2. 部署公钥到目标服务器
- 将公钥内容添加到目标服务器的
~/.ssh/authorized_keys
文件中:echo "ssh-rsa AAA... your_public_key" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
3. 在Jenkins中配置私钥
- 通过“Credentials”插件管理私钥:
- 安装插件:确保Jenkins已安装 Credentials 和 SSH Agent 插件。
- 添加凭证:
- 进入
Manage Jenkins
→Manage Credentials
→System
→Global credentials
。 - 点击 Add Credentials,选择类型
SSH Username with private key
。 - 输入:
- Username:目标服务器的用户名(如
root
或deploy
)。 - Private Key:直接粘贴私钥内容(非文件路径),若私钥有密码则填写
Passphrase
。
- Username:目标服务器的用户名(如
- 保存后,凭证将安全存储在Jenkins中。
- 进入
4. 在Job中使用SSH凭证
- 配置构建任务:
- 在Job的构建步骤中,选择
Execute shell
或SSH Agent
。 - 若使用
SSH Agent
,需指定之前添加的凭证ID(如ssh-deploy-key
),并在脚本中通过ssh
命令执行远程操作。
- 在Job的构建步骤中,选择
为什么不需要直接传递私钥文件?
- 安全性风险:
- 直接传递私钥文件可能导致权限泄露(如Jenkins运行用户无关权限)。
- 私钥可能被其他系统用户或进程访问。
- Jenkins设计理念:
- Jenkins通过 Credentials插件 统一管理敏感信息(如私钥、密码),避免明文存储。
- 私钥以加密形式存储在Jenkins内部,仅在任务执行时临时加载到内存。
常见问题与解决方案
-
问题1:Jenkins提示输入私钥密码
- 原因:私钥被加密(有
Passphrase
),但未在凭证配置中填写密码。 - 解决:在凭证配置的
Passphrase
字段中输入密码。
- 原因:私钥被加密(有
-
问题2:无法连接目标服务器
- 检查:
- 公钥是否正确部署到目标服务器的
authorized_keys
。 - 目标服务器的SSH端口、用户名是否正确。
- Jenkins凭证是否选择正确的ID。
- 公钥是否正确部署到目标服务器的
- 检查:
总结
- 正确流程:生成密钥对 → 部署公钥到目标服务器 → 在Jenkins凭证中添加私钥 → 在Job中使用凭证。
- 核心原则:私钥应通过Jenkins的凭证管理功能配置,而非直接传递文件,以确保安全性和可维护性。
参考文档:Jenkins Official SSH Plugin Documentation