需求
Jenkins部署的时候需要登陆到部署机执行shell脚本,然后采用ssh免密登陆。
具体步骤
(1)、客户端首先向服务器发送要对其进行身份验证的密钥对的用户名。
(2)、服务器检查客户端尝试登录用户帐户的下authorized_keys文件。
(3)、如果在文件中找到具有匹配公钥,则服务器生成随机数并使用公钥加密该随机数。并该加密消息发送给客户端。
(4)、如果客户端利用自己的私钥解密消息(如果可以的话),从而显示原始数。
(5)、客户端将解密的原始数和用于加密通信的共享会话密钥组合,计算他们的哈希值。客户端将该哈希值发回服务器,作为回应。
(6)、服务器使用相同的共享会话密钥和此前(步骤4)发送给客户端的原始编号来自行计算哈希值。将计算结果和客户端发回的哈希值对比。如果这两个值匹配,则证明客户端拥有私钥并且客户端已经过身份验证。
操作流程
客户端创建公钥私钥,然后将公钥放到被登陆机的指定目录下。
比如:
我的仓库服务器是A,用来拉代码和编译,需要登陆到执行服务器B。
- 服务器A生成公钥私钥
ssh-keygen -t rsa
//rsa可以省略,因为是默认值
执行后会生成两个文件:id_rsa、id_rsa.pub文件,前者是私钥,后者是公钥。
- 将id_rsa.pub文件复制到服务器B的指定目录
目录:/root/.ssh/
文件名:authorized_keys
方法1:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@主机IP
方法2:
1) 在服务器A上创建authorized_keys文件并将公钥追加到该文件。
cd /root/.ssh
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
//修改文件权限为600,该文件有规定如果属组其他人出现可写则文件就不会生效
2) 在服务器A指定用户家目录下创建 .ssh 目录(这里在root用户下创建,因为要使用密钥登陆到root用户)
mkdir .ssh
chmod 700 .ssh
//将目录权限改为700该目录的权限必须是700才有效
3) 将登录机创建的authorized_keys文件拷贝到被登录机,使用scp(自己下载了再传上去也行,注意文件权限即可)
scp authorized_keys root@服务器地址:/root/.ssh/
应用到Jenkins
安装插件:Publish over SSH
在配置中找到位置,填上私钥。(就是服务器A /root/.ssh/ 下生成的那个)
然后填上服务器的IP(hostname)、登录用户名即可测试。