本文首发于 https://jaychen.ccgit
做者 jaychengithub
写一篇短文,介绍 ssh 密钥登陆远程服务器流程和注意事项。ubuntu
密钥登陆比密码登陆安全,主要是由于他使用了非对称加密,登陆过程当中须要用到密钥对。整个登陆流程以下:安全
整个登陆的流程就是这么简单,可是在实际使用 ssh 登陆中还会碰到一些小细节,这里演示一遍 ssh 远程登陆来展现下这些细节问题。bash
使用 ssh-keygen
就能够直接生成登陆须要的密钥对。ssh-keygen
是 Linux 下的命令,不添加任何参数就能够生成密钥对。服务器
➜ ~ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jaychen/.ssh/id_rsa): #1
Enter passphrase (empty for no passphrase): #2
Enter same passphrase again: #3
复制代码
执行 ssh-keygen
会出现如上的提示,在 #1
处这里提示用户输入生成的私钥的名称,若是不填,默认私钥保存在 /home/jaychen/.ssh/id_rsa
文件中。这里要注意两点:ssh
ssh-keygen
命令的用户的家目录下的 .ssh
文件夹中。即 $HOME/.ssh/
目录下。.pub
的后缀。#2
处,提示输入密码,注意这里的密码是用来保证私钥的安全的。若是填写了密码,那么在使用密钥进行登陆的时候,会让你输入密码,这样子保证了若是私钥丢失了不至于被恶意使用。话是这么说,可是平时使用这里我都是直接略过。ui
#3
是重复 #2
输入的密码,这里就不废话了。加密
生成密钥以后,就能够在 /home/jaychen/.ssh/
下看到两个文件了(我这里会放在 /home/jaychen
下是由于我使用 jaychen 用户来执行 ssh-keygen
命令)spa
➜ .ssh ls
total 16K
drwx------ 2 jaychen jaychen 4.0K 12月 7 17:57 .
drwx------ 9 jaychen jaychen 4.0K 12月 7 18:14 ..
-rw------- 1 jaychen jaychen 1.7K 12月 7 17:57 id_rsa.github
-rw-r--r-- 1 jaychen jaychen 390 12月 7 17:57 id_rsa.github.pub
复制代码
生成的私钥还要注意一点:私钥的权限应该为 rw-------
,若是私钥的权限过大,那么私钥任何人均可以读写就会变得不安全。ssh 登陆就会失败。
登陆远程服务器的命令是
ssh 登陆用户@服务器ip
复制代码
这里开始要注意两个用户的概念:
在开始登陆以前,咱们要首先要把生成公钥上传到服务器。
公钥的内容要保存到要登陆的用户的家目录下的 .ssh/authorized_keys
文件中。假设你以后要使用 root 用户登陆远程服务器,那么公钥的内容应该是保存在 /root/.ssh/authorized_keys
中。注意 authorized_keys
文件是能够保存多个公钥信息的,每一个公钥以换行分开。
上传完毕以后,执行
ssh root@远程服务器 ip
复制代码
这个时候,如上面说的,远程服务器会发送一段随机字符串回来,这个时候须要使用私钥对字符串进行加密。而这个私钥会去执行该命令的用户的家目录下的 .ssh
目录读取私钥文件,默认私钥文件为 id_rsa
文件。即 $HOME/.ssh/id_rsa
文件。假设在生成密钥的时候对私钥进行了加密,那么这个时候就须要输入密码。
上面的流程用户登陆的时候是不会感知的,ssh 在背后完成了全部的校验操做,若是密钥匹配的话,那么用户就能够直接登陆到远程服务器,可是若是是首次登陆的话,会出现相似下面的提示:
➜ .ssh ssh root@192.168.1.1
The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established. ECDSA key fingerprint is SHA256:61U/SJ4n/QdR7oKT2gaHNuGxhx98saqMfzJnzA1XFZg. Are you sure you want to continue connecting (yes/no)? 复制代码
这句话的意思是,远程服务器的真实身份没法校验,只知道公钥指纹(公钥的 MD5 值)为 61U/SJ4n/QdR7oKT2gaHNuGxhx98saqMfzJnzA1XFZg
,是否真的要创建链接。出现上面的提示是由于避免存在中间人攻击。
中间人攻击的前提是,你第一次登陆一台远程服务器,你除了用户名、用户名对应的公钥私钥以及服务器 ip 以外,对远程服务器丝绝不了解的状况下。假设你 ssh 远程登陆 192.168.1.1 的远程主机,在链接过程当中被第三者拦截,第三者假冒本身为 192.168.1.1 的主机,那么你就会直接链接到其余人的服务器上。这就是中间人攻击。
为了不中间人攻击,ssh 在首次登陆的时候会返回公钥指纹,用户须要本身手动去比对你要登陆的远程服务器的公钥的公钥指纹和 ssh 返回的公钥指纹是否同样。
通过比较公钥指纹,确认该服务器就是你要登陆的服务器,输入 yes
以后就能够成功登陆。整个登陆流程结束。
第一次登陆以后,在本机的 $HOME/.ssh/
目录下就会生成一个 known_hosts
的文件,内容相似下面
➜ .ssh cat known_hosts
192.168.1.1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOPKYWolOYTDevvBR6GV0rFcI0z/DHZizN5l/ajApsgx+UcOOh51liuyBRRCIyF+BR56Le0lP0Pn6nzvLjbqMqg=
复制代码
这个文件记录了远程主机 ip 和远程主机对应的公钥指纹,那么在下次登陆的时候,远程主机发送过来的公钥指纹,直接和 known_hosts
文件中对应 ip 的公钥指纹比较便可。
不少时候,咱们开发可能须要链接多台远程服务器,而且须要配置 git 服务器的私钥。那么这么多的服务器不能共用一套私钥,不一样的服务器应该使用不一样的私钥。可是咱们从上面的链接流程能够看到,ssh 默认是去读取 $HOME/.ssh/id_rsa
文件做为私钥登陆的。若是想要不一样的服务器使用不一样的私钥进行登陆,那么须要在 .ssh
目录下编写 config
文件来进行配置。
config
的配置很简单,只要指明哪一个用户登陆哪台远程服务器须要使用哪一个私钥便可。下面给出一个配置示例。
Host github.com
User jaychen
IdentityFile ~/.ssh/id_rsa.github
Host 192.168.1.1
User ubuntu
IdentityFile ~/.ssh/id_rsa.xxx
复制代码
上面 config
文件字段含义以下:
编写好 config
文件以后,须要把 config
文件的权限改成 rw-r--r--
。若是权限过大,ssh 会禁止登陆。