SSH免密登录原理及方法

SSH 命令

使用 ssh 用户名@服务器IP 可以连接到服务器,这样做的缺点是每次都要输入密码,一方面是不安全,另一方面是麻烦。

SSH 免密登录服务器

在本地主机上使用 ssh-keygen -t rsa 生成密匙对,这里的 -t rsa 指的是用 rsa 加密方式生成密匙:

image.png

第一步,输入密匙存放目录,使用默认路径直接按回车即可:

1
2
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):

第二步,输入密码,建议直接回车使用空密码:

1
2
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

如果输入了密码则需要再输入一次确认密码。这里的密码不是指远程登录主机的密码,而是使用密匙时的密码,既然我们是希望免密登录了,自然不希望再输入任何密码,因此此处填空即可。

1
2
3
4
5
6
7
8
9
10
11
+---[RSA 2048]----+
| .. . |
| o. . . o |
| o...+* + |
| .o+*+O |
| . =+So+o |
| . . . @.*B. |
| o . . Eoo. |
| o * .. |
| ..o o. |
+----[SHA256]-----+

上面会生成 randomart image 图案,这个图案是根据密匙生成的,因此每个人看到的都不同。

趣味小科普:为什么要生成这种图案呢?这是由于密匙对是一个很长的随机字符串,比起加密的字符串人们更容易接受图片,可以说是很贴心了

生成的密匙包含一对,公钥和私匙其实叫做私钥,但感觉这样比较有意思所以就这么写):

1
2
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

我们根据路径可以找到文件所在位置:

1
2
3
[root@VM_0_8_centos ~]# cd /root/.ssh
[root@VM_0_8_centos .ssh]# ls
authorized_keys id_rsa id_rsa.pub

这两个密匙文件分别是:

  • id_rsa 生成的私钥文件
  • id_rsa.pub 生成的公钥文件

另外一个 authorized_keys 是保存远程免密登录公钥的文件,主要通过这个文件记录多台机器的公钥,我们要做的就是把本机的公钥发送到服务器主机的这个文件里。

接着,把公钥发到需要登录的服务器主机上:

1
ssh-copy-id -i /root/.ssh/id_rsa.pub 服务器IP地址:/root/.ssh/authorized_keys

接着会要求你输入一次密码,输入完成后就可以实现免密登录了。

在本机上执行 ssh 用户名@服务器IP,不再需要输入密码验证。

SSH 添加别名

网络上的教程一般到上一步就结束了,在这里传授一个小技巧可以事半功倍。

虽然我们现在跳过了输入密码这个步骤,但是每次都要输入 IP 也是很蛋疼的一件事,我们甚至想要不输入 IP 就能登录到远程服务器

这也能做到!

在本地进入 .ssh 目录:

1
2
# 进入 .ssh 目录
FireRabbitdeMacBook-Pro:.ssh firerabbit$ cd ~/.ssh

使用 vim config 编辑文件并且输入以下内容:

1
2
3
4
Host dev
HostName 127.0.0.1
User root
Port 22

这里的 dev 是我们给远程主机起的别名,127.0.0.1 是远程主机的地址,请替换成你的服务器 IP,User 即登录的用户名,Port 为服务器访问端口,如果修改了端口在这里也要修改。

现在我们的目录应该是这样的:

1
2
FireRabbitdeMacBook-Pro:.ssh firerabbit$ ls
config id_rsa id_rsa.pub known_hosts

known_hosts 是连接过的主机记录,可以随意删除。

接着在命令行输入:ssh dev 即可连接到服务器!

阅读至此,恭喜你!Linux Exp + 1

报错问题

如果出现如下报错:

1
/usr/bin/ssh-copy-id: ERROR: ssh: Could not resolve hostname xxx:/root/.ssh/authorized_keys: nodename nor servname provided, or not known

网上查了下,大都是说 hosts 文件的问题。

可以尝试修改 /etc/hosts 看看是否有如下行,如果没有则添加:

1
127.0.0.1 localhost

经过本人尝试结果无效,可用别的方法。

那就是——手动上传!!!

编辑本地主机的密匙文件:

1
vim ~/.ssh/id_rsa.pub

把密匙内容全部拷贝下来。

接着先用 ssh root@远程主机IP 用密码登录进去,然后在远程主机中 vim /root/.ssh/authorized_keys

把复制的密钥直接粘贴下来就可以啦!

免密登录原理

网上的教程一般都是直接贴出代码和操作步骤,但这样我们根本不清楚它的原理是什么。

我们希望能像侦探一样追根究底,查清楚它的原理是什么。

真正理解后的知识才能永远刻入你的脑海里

上面的步骤,我们在本机生成一个密匙对,一共包含两个文件,一个是公钥,一个是私匙,公钥是发送到服务器主机的,私匙是留在本地的。

这样包含一对公钥私匙的加密叫做“非对称加密”。

对称加密

在了解非对称加密之前需要先了解对称加密,所有新事物的出现必然伴随着某种需求。

小红和小明私底下正在交往,但又不希望被别人发现,于是他们约定了一种加密算法,每个字母向后移动一位,如 a 往后移一位是 b,b 往后移一位是 c……z往后移是 a。

那么,ni hao 就变成了 oj ibp

由于双方约定好了同样的加密算法,所以小红发给小明消息时,就可以按照约定好的算法进行解密。

于是他们大胆的在班级群里用加密后的消息进行聊天,其他同学一脸茫然的看着不明觉厉的消息。

但是此时,名侦探小刚破解了他们约定好的加密算法,并且截获了(截获很简单,毕竟他们公然秀恩爱)他们互通的消息,此时小红和小明的聊天记录就被小刚一清二楚的知道了!

非对称加密

聊天记录被小刚公开后,小明和小红十分尴尬,于是机智的小明想出了一种方法,把前面约定的加密算法做了一些小的改进,小明告诉小红,我发给你一个密匙串,你用这个给消息进行加密(某种加密算法),你发给我消息后,我再用我这边的密匙进行解密,我发给你的密匙和我本地的密匙是不同的,只有我本地的密匙才能解密你加密过的内容。

问题又来了……现在只有小明破解小红的消息,小明用公钥加密消息发给小红,小红是解密不了的;如果需要双向沟通的话,自然是用同样的方法,小红也给小明一个密匙,小红本地存有另外一个用来解密的密匙。但是 Linux 免密登录是本机免密登录到服务器,属于单向的沟通,如果你希望服务器也能免密登录本机(一般不会有这种需求),就在服务器用同样的方法生成密匙,把密匙发生到本机就可以了。

接下来的日子,小刚也无法破解他们的聊天记录,恼羞成怒的小刚带着三名小弟放学后去堵小红,逼迫小红把小明给她的加密密匙交出来,小红无奈之下将密匙交出,然而,即使拿到密匙,小刚依然无法破解小红的密码,因为,还需要小明手里的密匙才能解密小红的消息

非对称加密的存在就是为了避免加密算法被第三者知道,导致密码泄露。上面的故事中小明交给小红的加密串叫做公钥,公钥可以让任何第三者知道,公钥加密过的密码只有小明手里的加密串——私匙才能解密,对于加密和解密使用不同的加密策略,叫做非对称加密

使用公钥实现免密登录

我们通过 ssh-keygen -t rsa 生成了公钥和私匙对,接着我们把公钥发送到服务器上,当连接的时候,服务端会发送一个用公钥加密的字符串过来,本地再使用私匙进行解密,实现了登录验证,从而不需要输入密码就能进行登录。

用盗来的一张图解释:

image.png

RSA 非对称加密算法

参考:百度百科 - RSA

只做兴趣了解,不需要掌握原理,因为我们的研究方向不是这个。

文章作者: 火烧兔子
文章链接: http://huotuyouxi.com/2020/03/07/ssh-no-password-method/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 火兔游戏工作室