前言:
1.基于口令的认证(password认证):
客户端向服务器发出password认证请求,将用户名和密码加密后发送给服务器,服务器将该信息解密后得到用户名和密码的明文,与设备上保存的用户名和密码进行比较,并返回认证成功或失败消息。
2.基于密钥的认证(publickey认证):
客户端产生一对公共密钥,将公钥保存到将要登录的服务器上的那个账号的家目录的.ssh/authorized_keys文件中。认证阶段:客户端首先将公钥传给服务器端。服务器端收到公钥后会与本地该账号家目录下的authorized_keys中的公钥进行对比,如果不相同,则认证失败;否则服务端生成一段随机字符串,并先后用客户端公钥和会话密钥对其加密,发送给客户端。客户端收到后将解密后的随机字符串用会话密钥发送给服务器。如果发回的字符串与服务器端之前生成的一样,则认证通过,否则,认证失败。
[admin@localhost ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/admin/.ssh/id_rsa.
Your public key has been saved in /home/admin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:DEoH5oaQ2oJ8FT/oYGzCPuQvYYSg7YLO46LRa3fkDRE admin@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|o. o.. |
|*o.+ oE |
|**o==.o+ |
|Xo=+oo.o. |
|oBo .. .S |
|+o+ o |
|.=.. o o |
|o.+.. o . |
|+o.. . |
+----[SHA256]-----+
一、密钥生成
- 非对称加密:SSH免密登录首先依赖于非对称加密技术,即生成一对密钥:公钥(public key)和私钥(private key)。公钥是公开的,可以分享给任何人;私钥是私有的,必须严格保密。
- 密钥生成:在客户端机器上,使用
ssh-keygen
命令生成密钥对。默认情况下,生成的私钥文件名为id_rsa
,公钥文件名为id_rsa.pub
,并保存在用户目录下的.ssh
文件夹中。
二、公钥传输与认证
- 公钥传输:将客户端生成的公钥(
id_rsa.pub
)传输到服务器的~/.ssh/authorized_keys
文件中。这可以通过手动复制粘贴或使用ssh-copy-id
命令自动完成。 - 公钥认证:当客户端尝试通过SSH连接到服务器时,SSH服务器会检查
~/.ssh/authorized_keys
文件中是否存在与客户端公钥相匹配的公钥。
三、认证过程
- 客户端请求连接:客户端向SSH服务器发起连接请求。
- 服务器响应:服务器生成一个随机数(挑战),并使用客户端的公钥加密这个随机数,然后将加密后的随机数发送给客户端。
- 客户端解密:客户端使用自己的私钥解密接收到的加密随机数,得到原始的随机数。
- 会话密钥生成:客户端和服务器都使用这个随机数作为基础,通过一系列复杂的算法生成一个会话密钥(session key)。这个会话密钥用于后续通信的加密和解密。
- 认证成功:如果客户端能够成功解密服务器发送的加密随机数,并生成与服务器相同的会话密钥,则认证成功。此时,客户端和服务器之间的通信就可以使用会话密钥进行加密和解密了。