参考文献:

SSH 免密登录是怎么玩儿的?

ssh的用户配置文件config管理ssh会话

ssh-keygen -t rsa -C "content" 解释

linux上ssh免密登录原理及实现

ssh 协议

SSH 是一种计算机之间加密登录的协议,它相对于 telnet 和 rsh 的明文传输,提供了加密、校验和压缩,使得我们可以很安全的远程操作。

私钥加密

也称为对称加密,就是说加密方和解密方用的都是同一个 key,这个 key 对于加密方和解密方来说是保密的,第三方是不能知道的。在第三方不知道私钥的情况下,是很难将加密的数据解密的。一般来说是加密方先产生私钥,然后通过一个安全的途径来告知解密方这个私钥。

公钥加密

公钥加密,是说解密方首先生成一对密钥,一个私钥一个公钥,私钥不会泄漏出去,而公钥则是可以任意的对外发布的。
用公钥进行加密的数据,只能用私钥才能解密。加密方首先从解密方获取公钥,然后利用这个公钥进行加密,把数据发送给解密方。
解密方利用私钥进行解密。如果解密的数据在传输的过程中被第三方截获,也不用担心,因为第三方没有私钥,没有办法进行解密。

公钥加密的问题还包括获取了公钥之后,加密方如何保证公钥来自于确定的一方,而不是某个冒充的机器。
假设公钥不是来自我们信任的机器,那么就算我们用公钥加密也没有用,因为加密之后的数据是发送给了冒充的机器,该机器就可以利用它产生的私钥进行解密了。所以公钥加密里面比较重要的一步是身份认证。

需要说明一下,一般的私钥加密都会比公钥加密快,所以大数据量的加密一般都会使用私钥加密,
而公钥加密会作为身份验证和交换私钥的一个手段。

身份验证

身份验证说的是,判断一个人或者机器是不是就是你想要联系的。也就是说如果 A 想要和 B 通信,一般来说开始的时候会交换一些数据,A 怎么可以判断发送回来的数据就真的是 B 发送的呢?现实中有很多方法可以假冒一个机器。

在 SSH 里面,这主要是通过公钥来完成的。首先服务器会有一个公钥列表,保存的是它信任的机器上面的公钥。
在开始 SSH 连接之后,客户端会发送过来一个公钥,然后服务器就会进行查找,如果这个公钥在这个列表里面,就说明这个机器是真的客户端。

当然实际的情况会复杂一些。实际上客户端不是真的发送公钥过来,因为这很容易被第三方盗取。

免密登录

原理

  1. 在客户端使用ssh-keygen 生成一对密钥:公钥+私钥
  2. 将客户端公钥追加到服务端的authorized_key 文件中,完成公钥认证操作
  3. 认证完成后,客户端向服务端发起登录请求,并传递公钥到服务端
  4. 服务端检索authorized_key 文件,确认该公钥是否存在
  5. 如果存在该公钥,则生成随机数R,并用公钥来进行加密,生成公钥加密字符串pubKey(R)
  6. 将公钥加密字符串传递给客户端
  7. 客户端使用私钥解密公钥加密字符串,得到R
  8. 服务端和客户端通信时会产生一个会话ID(sessionKey),用MD5R和SessionKey 进行加密,生成摘要(即MD5 加密字符串)
  9. 客户端将生成的MD5 加密字符串传给服务端
  10. 服务端同样生成MD5(R,SessionKey) 加密字符串
  11. 如果客户端传来的加密字符串等于服务端自身生成的加密字符串,则认证成功
  12. 此时不用输入密码,即完成建连,可以开始远程执行shell 命令了

生成 SSH 私钥和公钥

ssh-ken -t rsa -C rainsheep
  • -t 指定创建密钥的类型,可以使用:"rsa1"(SSH-1)、"rsa"(SSH-2)、"dsa"(SSH-2)

  • -C ,指定注释 ,这个注释一般都在公钥后边

    ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSUNrRFi9wrf+M7Q== rainsheep
    

    很多网站都要求使用邮箱、用户名之类的,仅仅是用来识别用的 key,很多网站利用这个注释作为密钥的名字。

  • 当你在生成SSHKEY的时候在命令行下会提示你Enter file in which to save the key,让你确认密钥文件保存的路径,一般回车即可(一般默认会在当前用户家目录下的.ssh目录下)。

  • 第二个提示是 Enter passphrase (empty for no passphrase) 让你输入一个密钥的密码,如果不输入则留空,密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。

  • .ssh 目录下的 id_rsa 即为私钥,id_rsa.pub 即为公钥

上传公钥到服务器

  • 将本机的 ~/.ssh/id_rsa.pub 文件配置到服务器的 ~/.ssh/authorized_keys 文件中,一个公钥一行

    • 使用 ssh-copy-id 进行上传,运行 ssh-copy-id xxx@0.0.0.0 会自动将公钥追加到 authorized_keys 文件中。
  • 需要注意权限问题

  • .ssh 目录的权限为 700

  • authorized_keys 目录的权限为600

免密登录

  • 此时,ssh user@host 即可免密登录服务器

  • host 可能比较难记,我们可以给 host 起别名,通过别名连接

    host newname
        user username
        hostname host/ip
        port port
        identityfile ~/.ssh/id_rsa
    

    然后,通过 ssh newname 即可连接服务器