一 ssh-keygen细节
需求:以脚本的方式非交互的产生
ssh-keygen -f ~/.ssh/id_rsa -t rsa -N ''
-t : '指定创建密钥的类型' --> '一般是rsa'
-f : '指定保存密钥的文件名'
-N : '加密' --> ''表示输入密码为空
理解: '对照命令名交互输出来理解'
后续补图
二 再次理解ssh免密原理
更细节讲解
'客户端 <----> 服务端'
(1) 客户端(client) 使用 'ssh-keygen' 生成一对密钥:'公钥+私钥'
(2) 将客户端公钥追加到服务器端'对应用户的'~/.ssh/authorizied_key文件中,完成'公钥认证操作'
ssh-copy-id '[ -i ~/.ssh/id_rsa.pub ]' 用户@{ip,hostname}
注意1: 如果'pub公钥不是在默认路径下',需要指定 -i参数
注意2: 需要知道'远程主机的密码'
(3) 认证完成后,客户端向服务器发送'登陆请求',并传递'客户端公钥'到服务器端,同时会将'服务器的公钥'写到--> 'known_hosts'
ssh user@ip
1) 用户'客户端'需要'输入yes'来决定接受这个'远程主机的公钥'
2) /etc/ssh/ssh_config'客户端配置文件',跳过这个known_hosts的询问机制--> 'StrictHostKeyChecking no' --> '自动化的脚本'
(4) 服务器检索authorizied_key文件,确认该公钥'客户端的公钥'是否存在?
(5) 如果存在该公钥,则'远程主机侧'生成随机数,并用'客户端'该公钥加密,生成公钥加密字符'pubkey(R)'
(6) 服务器端'将加密的公钥字符'传送给'客户端'
(7) 客户端使用'自己的私钥'进行解密-->'得到R'
(8) 服务器和客户端产生通信的时候会产生一个会话id'SessionKey',用MD5对R和SessionKey进行加密,生成摘要'(MD5加密字符串)'
备注:'会话id是唯一的',确保'不会伪造'
(9) 客户端将'生成的MD5加密字符串'传给服务端
(10)服务器端同样生成'MD5(R,SessionKey)' 加密字符串
(11)服务器侧对比客户端产生的加密字符串,如果相等则认证成功
(12)此时'不用输入密码',即建立连接