在 SSH(Secure Shell)中,密钥对用于加密和身份验证,保证了远程会话的安全。一个密钥对包括两部分:公钥和私钥。它们有不同的作用和特性:
私钥
- 私钥是一个用户保密的密钥,它绝不能被泄露或分享给其他人。
- 保存在用户的本地计算机上,用于 SSH 进行安全的认证。
- 通常由 SSH 客户端软件生成并带有密码保护(可选)。
- 在 SSH 登录过程中,私钥被用来对服务端发起的挑战进行签名,进而证明客户端确实拥有对应的私钥。
公钥
- 公钥可以安全地分享给任何人,没有泄露风险。
- 需要被放置在远程服务器上用户账号的
~/.ssh/authorized_keys
文件中。 - 当有客户端尝试连接服务器时,服务器会使用公钥来验证这个客户端发送的签名是否合法,以此确认远程登录用户持有对应的私钥。
SSH 密钥认证过程
- 客户端请求连接到 SSH 服务器。
- 服务器检查客户端是否提供了一个公钥。
- 如果客户端提供了一个公钥,服务器使用这个公钥生成一个随机数并发送给客户端作为挑战(challenge)。
- 客户端使用私钥对这个挑战进行签名,然后将签名发送回服务器。
- 服务器用公钥验证这个签名。如果验证成功,说明客户端持有匹配的私钥,服务器允许客户端登录。
在实际操作中,用户首先需要在本地计算机上使用 SSH 客户端生成密钥对,然后将生成的公钥放置到想要访问的服务器的相应账户下。私钥应该妥善保存在本地计算机上,并且应尽可能设置密码保护,避免未授权访问。
总的来说,公钥可以看作锁,而私钥就是打开这把锁的钥匙。公钥可以放在服务器上,谁都可以看到(用于上锁),但只有拥有私钥的人才能解开(认证成功)。在 SSH 安全模型中,所用密钥对的加密算法通常是 RSA 或 ECDSA 等。
SSH 公钥和私钥的生成通常通过使用 ssh-keygen
命令行工具进行。当生成一个密钥对时,公钥和私钥会自动具有绑定的关系,因为它们是同时生成的,并且是数学上互相对应的。以下是生成和使用密钥对的一般步骤:
生成 SSH 密钥对:
- 打开终端。
- 输入命令
ssh-keygen
并按回车键。 - 系统将会提示你选择保存密钥对的位置。如果接受默认位置(通常是
~/.ssh/id_rsa
),直接按回车键。 - 系统会问你是否要设置一个密码保护私钥。如果想要设置密码(这一步是可选的,但为了安全性,建议设置),输入你的密码并确认;否则直接按回车键。
- 密钥对生成完毕后,私钥保存在了指定位置,而公钥(通常是私钥文件名后加
.pub
扩展,例如~/.ssh/id_rsa.pub
)也会在同一目录下生成。
将公钥添加到远程服务器:
-
需要将你的公钥内容复制到远程服务器上你账户的
~/.ssh/authorized_keys
文件中。可以通过以下步骤完成:
首先,在本地终端查看和复制你的公钥内容:
cat ~/.ssh/id_rsa.pub
- 登录到你的远程服务器。
- 打开或创建
~/.ssh/authorized_keys
文件,并将公钥内容粘贴进去:
echo your_public_key_string >> ~/.ssh/authorized_keys
把 `your_public_key_string` 替换为实际的公钥内容。
2. 确保 ~/.ssh
目录和 authorized_keys
文件的权限设置正确:
~/.ssh
目录的权限应该是700
。~/.ssh/authorized_keys
文件的权限应该是600
。
绑定关系:
生成密钥对时,它们就已经有了绑定关系,即:
- 私钥包含了独一无二的私有秘密信息,不能泄露给其他人。
- 公钥是从私钥中推导出来的,可以安全地公开和分发。
虽然公钥可以被任何人知道,但只有持有相关联的私钥的人才能验证由公钥加密的信息。
当进行 SSH 连接时,服务器会使用公钥加密一段信息,然后发送给客户端。客户端必须使用私钥来解密这段信息并正确响应,这样才能证明客户端拥有与公钥配对的私钥,从而完成验证过程。
简而言之,公钥和私钥的关系是通过特定的加密算法(如 RSA、ECDSA)自动生成的,一旦生成就是固定的一对。
要在 Ubuntu 20.04 LTS 创建一个新用户并为该用户设置 SSH 私钥,你可以通过以下步骤操作:
1. 新增用户:
打开终端并使用 adduser
命令来创建新用户,如下:
sudo adduser newusername
跟随提示完成新用户的创建过程,系统会要求你设置密码和一些附加信息。
2. 为新用户创建 SSH 目录:
切换到新用户,然后在其主目录下创建 .ssh
目录和 authorized_keys
文件:
sudo su - newusername
mkdir ~/.ssh
touch ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
注意:使用 chmod
命令设置正确的权限是很重要的,它可以防止未授权的用户访问 SSH 密钥。
3. 复制公钥到 authorized_keys
文件:
将生成的或预先存在的 SSH 公钥复制到 ~/.ssh/authorized_keys
文件中。可以使用如下命令:
echo your_public_key_string >> ~/.ssh/authorized_keys
替换 your_public_key_string
为你的实际公钥内容。
4. 设置 SSH 私钥:
在客户端计算机(即你要从中远程登录的计算机)上,如果你之前没有生成过 SSH 密钥,可以使用以下命令生成新的密钥对:
ssh-keygen
之后在客户端计算机上找到你的公钥(默认位置为 ~/.ssh/id_rsa.pub
),并使用上面的命令步骤把它添加到服务器上新用户的 authorized_keys
文件里。
5. 测试 SSH 连接:
现在从你的客户端计算机尝试通过 SSH 登录到服务器:
ssh newusername@server_ip_address
替换 newusername
为你创建的用户名称,server_ip_address
为 Ubuntu 服务器的 IP 地址。
如果 SSH 密钥生成过程中设置了密码,那么你第一次尝试 SSH 连接时,系统将提示你输入该密码。
请确保服务器的 SSH 服务已启动并运行,服务器的防火墙设置允许通过 SSH 默认端口 22(或者你自定义设置的其他端口)的连接。一旦一切设置完成,你应该能够无需密码,仅使用 SSH 秘钥登录到服务器上的新用户。
标签:公钥,私钥,SSH,服务器,ssh,客户端 From: https://blog.csdn.net/zhu_superman/article/details/137266694