SSH的全称是Secure Shell,主要用途之一是远程登录。在使用VPS时我们会经常使用到SSH,这里总结一下SSH的两种登录方式。
SSH的登录方式有以下两种:

  • 口令登录
  • 公钥登录

下面对以上两种登录方式逐一介绍

口令登录

口令登录的整个过程是这样的:

  • 远程主机收到用户的登录请求,把自己的公钥发给用户。
  • 用户使用这个公钥,将登录密码加密后,发送回来。
  • 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

第一次尝试登录一台VPS,你在终端尝试如下方式登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
QuinnChens-MacBook-Pro:.ssh Quinn$ ssh root@139.162.xxx.xxx
The authenticity of host '139.162.xxx.xxx (139.162.xxx.xxx)' can't be established.
ECDSA key fingerprint is SHA256:A8AiPFbsTEHDlCgKt1x/Q3vMXpTt4JdoIDf1+dEc144.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '139.162.xxx.xxx' (ECDSA) to the list of known hosts.
root@139.162.xxx.xxx's password:
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 4.8.6-x86_64-linode78 x86_64)
* Documentation: https://help.ubuntu.com/
New release '16.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Last login: Sun Feb 19 12:48:41 2017 from 14.19.154.20
root@ubuntu:~#

此时VPS返回给你一串摘要字符串,这是一段服务器的公钥的摘要,并且让你选择是否接受这个公钥。这时有两个问题,我怎么知道应不应该接受它?还有,如果接受这个公钥会怎么样?

回答第一个问题:为了防止中间人攻击,HTTPS是使用证书认证机制,而SSH是没有借助证书的,所以为了验证公钥的可靠性,远程的机器需要在自己的网站贴出自己的公钥摘要,然后人工去检查公钥的真伪。

回答第二个问题:如果接受了这个公钥,你继续输入密码即可登录VPS,而且本地的~/.ssh/known_hosts中会保存这把公钥。下次使用这种方式登录,则只需要输入密码即可。客户端就会使用服务器的公钥对密码加密,发送给远程主机,远程主机使用私钥解密后,校验密码正确与否。

另外,上面服务器发送客户端的公钥,存储在服务器的/etc/ssh/ssh_host_rsa_key.pub中(有可能是同目录下的其他.pub文件中)

此处记录一个我遇到一个问题,就是当我登录了远程主机,亲自去校验公钥的摘要时,发现如果本地机器和远程主机的ssh的版本不一样,生成公钥的摘要的算法也不同,检查起来还挺麻烦的,网上有不少关于这个问题的文章,我还没完全找到方法,

公钥登陆

如果每次都使用密码登录,显然显得繁琐,那么你可以选择公钥登录。

公钥登录的原理如下:客户端将自己的一个公钥分享给远程主机,每次用户的登录时,远程主机向用户发送一份随机数,用户用自己的私钥对这份随机数加密,然后发送回远程主机,远程主机使用来自用户的公钥解密,进行校验,即可验证登录合法性。

为了使用这种方式登录,你需要将本地的.ssh/id_rsa.pub的内容存储到服务器的.ssh/authorized_keys文件中。
你可以使用以下命令实现以上功能。

1
ssh-copy-id user@host

而如果本地还未存在.ssh/id_rsa.pub文件,则可以使用以下命令生成

1
ssh-keygen

在生成密钥时,终端会要求你生成一份密钥的口令(密码的密码),下次你登录时,虽然不用输入远程主机的密码,但是你需要输入这个密钥的口令。这样也好,否则所有人用你的这台电脑都可以登录到你的VPS了。

以上就是关于SSH两种登录方式的介绍,其实SSH除了用于远程登录,还有一个用途就是用于很多穿越GFW的领域,这涉及到SSH的端口转发功能。