在 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 秘钥登录到服务器上的新用户。
使用vscode远程连接服务器:
- 打开 VS Code。
- 确保已经安装了 Remote - SSH 扩展。
- 按下
Ctrl+Shift+P
或F1
打开命令面板。 - 输入并选择 "Remote-SSH: Open Configuration File"。
- 在打开的 SSH 配置文件中添加以下内容:
Host my-ubuntu-server
HostName my-ubuntu-server
User ubuntu
IdentityFile C:/Users/id_rsa
注意,在 Windows 中您应使用正斜杠 /
或者双反斜杠 \\
作为路径分隔符。
- 保存配置文件并关闭。
- 在 "远程资源管理器" 面板中,找到 "SSH TARGETS" 部分下的 "my-ubuntu-server"。
- 点击它以尝试连接到远程服务器。
确保在远程服务器上 ubuntu
用户的 ~/.ssh/authorized_keys
文件包含从您的私钥文件相对应的公钥。您还需要确保私钥文件的权限设置是安全的,即这个密钥文件只对您的用户账户是可访问的。在 Windows 上,通常是确保文件属性设置为 "仅当前用户"。
在 Ubuntu 上配置 Git 使用 SSH 私钥的步骤通常如下:
1. 生成 SSH 密钥对(如果你还没有):
打开终端,并使用以下命令来生成一个新的 SSH 密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
按照提示操作,选择保存密钥对的路径(通常是默认值 ~/.ssh/id_rsa
),以及可选的密码。
2. 将公钥添加到远程 Git 仓库:
- 首先,查看生成的公钥并复制内容:
cat ~/.ssh/id_rsa.pub
- 然后登陆你的远程 Git 仓库服务(例如 GitHub、GitLab 等),找到添加 SSH 密钥的设置页面,将复制的公钥内容粘贴到相应区域。
3. 设置 SSH 私钥:
在命令行中,配置 Git 使用特定的 SSH 私钥文件(如果你生成了默认的 id_rsa
,这步可以跳过):
ssh-add ~/.ssh/your_private_key
如果私钥受密码保护,此命令将提示你输入密码。
4. 配置 Git SSH 命令:
为 Git 设置 SSH 命令,这样它就会使用 ssh-add
添加的密钥。打开或创建 ~/.ssh/config
文件,并添加以下内容:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/your_private_key
IdentitiesOnly yes
将 github.com
替换成你要访问的 Git 仓库的服务域名,并且确保密钥文件路径是正确的。
5. 测试 SSH 连接:
通过执行 SSH 连接来测试你的设置:
ssh -T git@github.com
如果 Git 服务是 GitHub,你将看到一条消息确认你成功认证。
6. 设置 Git 使用 SSH:
确保 Git 仓库使用 SSH URL 而不是 HTTPS URL。在你的仓库目录中执行以下命令:
git remote set-url origin git@github.com:username/repo.git
替换 username
和 repo.git
为你的 GitHub 用户名和仓库名。
命令 git remote set-url origin git@github.com:username/repo.git
用于修改现有的 Git 仓库的远程 'origin' 的 URL。当你想切换一个仓库的远程源地址时会使用到这个命令。这在你迁移仓库或者修改连接方式(如从 HTTPS 切换到 SSH)时特别有用。
git remote set-url
是 Git 命令的一部分,用于设置一个特定远程仓库的 URL。origin
是默认的远程仓库的名称,在大多数情况下,'origin' 是你克隆仓库时自动创建的远程仓库的名称。git@github.com:username/repo.git
是新的远程仓库 URL,使用的是 SSH 协议。这里的 'username' 替换为你的 GitHub 用户名,'repo.git' 替换为你的仓库名称。
如果你的确需要修改远程仓库的 URL 来使用 SSH,你应该已经在你的 GitHub 账户中添加了你的 SSH 公钥。一旦你执行了这个命令并且你的 SSH 设置正确无误,之后的 git push
和 git pull
命令都将通过 SSH 连接到 GitHub。
执行完这些步骤后,你的 Git 会话应该配置为通过 SSH 秘钥进行身份验证。当你推送或拉取该仓库的内容时,就会自动使用配置的 SSH 私钥。请确保你的公钥正确添加到了 Git 服务器,并且私钥保存在你配置的位置。