本文参考自不知小李的博客 SSH(Secure Shell)是一套协议标准,可以用来实现两台机器之间的安全登录以及安全的数据传送,其保证数据安全的原理是非对称加密。

传统的对称加密是指客户端和服务器使用同一套秘钥,泄露的风险很高;SSH是客户端和服务端各自生成一套私钥和公钥,并且互相交换公钥,这样每一条发出的数据都可以用对方的公钥来加密,对方收到后再用自己的私钥来解密。(公钥用来加密,私钥用来解密)。

ssh 私钥转换为pem公钥 ssh公钥私钥认证原理_服务端

两台机器除了各自的一套公、私钥之外,还保存了对方的公钥

1. 创建连接

  1. 客户端发起链接请求
  1. 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
  2. 客户端生成密钥对
  3. 客户端用自己的公钥异或会话ID,计算出一个值,并用服务端的公钥加密
  4. 客户端发送加密后的值到服务端,服务端用私钥解密
  5. 服务端用解密后的值异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)

ssh 私钥转换为pem公钥 ssh公钥私钥认证原理_服务端_02

至此,双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密.

SSH虽然传输过程中很安全,但是在首次建立链接时并没有办法知道发来的公钥是否真的来自自己请求的服务器,如果有人在客户端请求服务器后拦截了请求,并返回自己的公钥冒充服务器,这时候如果链接建立,那么所有的数据就都能被攻击者用自己的私钥解密了。这也就是所谓的中间人攻击。

2. 利用密码登录

2.1 账号密码登录

  1. 服务端收到登录请求后,首先互换秘钥,详细步骤如上一节所述。
  1. 客户端用服务端的公钥加密账号密码并发送
  2. 服务端用自己的秘钥解密后得到账号密码,然后进行验证
  3. 服务端用客户端的公钥加密验证结果并返回
  4. 服务端用自己的秘钥解密后得到验证结果

ssh 私钥转换为pem公钥 ssh公钥私钥认证原理_shell_03

2.2 利用公钥登录(用于实现无密码登录,如客户端连接服务器)

  1. 客户端用户必须手动地将自己的公钥添加到服务器一个名叫authorized_keys的文件(保存了所有可以远程登录的机器的公钥)。
  1. 客户端发起登录请求,并且发送一个自己公钥的指纹(具有唯一性,但不是公钥)
  2. 服务端根据指纹检测此公钥是否保存在authorized_keys中
  3. 若存在,服务端便生成一段随机字符串,然后利用客户端公钥加密并返回
  4. 客户端收到后用自己的私钥解密,再利用服务端公钥加密后发回
  5. 服务端收到后用自己的私钥解密,如果为同一字符串,则验证通过

备注:github添加ssh方法

1. 查看本机是否已经有SSH秘钥,id_rsa.pub 或 id_dsa.pub 文件

文件路径: ~/.ssh

2. 如果没有,则需要创建一个 SSH key

ssh-keygen -t rsa -C "your_email@example.com"

代码参数含义:
> -t 指定密钥类型,默认是 rsa ,可以省略。
> -C 设置注释文字,比如邮箱。
> -f 指定密钥文件存储文件名。

3. 添加 SSH key 到 github上面去

拷贝 id_rsa.pub 文件的内容,点击 github上的Add SSH key 按钮添加内容 。