linux杂谈之ssh静默产生公钥和私钥

一    ssh-keygen细节

需求:以脚本的方式非交互的产生

ssh-keygen -f ~/.ssh/id_rsa -t rsa -N ''

-t : '指定创建密钥的类型'   -->  '一般是rsa'

-f : '指定保存密钥的文件名' 

-N : '加密' --> ''表示输入密码为空

理解: '对照命令名交互输出来理解'

后续补图

二    再次理解ssh免密原理

linux杂谈之ssh静默产生公钥和私钥_第1张图片

更细节讲解

                          '客户端   <---->    服务端'

 
(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)此时'不用输入密码',即建立连接

 

你可能感兴趣的:(shell编程)