SSH中私钥和公钥的使用

news/2024/4/17 8:44:16

在 SSH(Secure Shell)中,密钥对用于加密和身份验证,保证了远程会话的安全。一个密钥对包括两部分:公钥和私钥。它们有不同的作用和特性:

私钥

  • 私钥是一个用户保密的密钥,它绝不能被泄露或分享给其他人。
  • 保存在用户的本地计算机上,用于 SSH 进行安全的认证。
  • 通常由 SSH 客户端软件生成并带有密码保护(可选)。
  • 在 SSH 登录过程中,私钥被用来对服务端发起的挑战进行签名,进而证明客户端确实拥有对应的私钥。

公钥

  • 公钥可以安全地分享给任何人,没有泄露风险。
  • 需要被放置在远程服务器上用户账号的 ~/.ssh/authorized_keys 文件中。
  • 当有客户端尝试连接服务器时,服务器会使用公钥来验证这个客户端发送的签名是否合法,以此确认远程登录用户持有对应的私钥。

SSH 密钥认证过程

  1. 客户端请求连接到 SSH 服务器。
  2. 服务器检查客户端是否提供了一个公钥。
  3. 如果客户端提供了一个公钥,服务器使用这个公钥生成一个随机数并发送给客户端作为挑战(challenge)。
  4. 客户端使用私钥对这个挑战进行签名,然后将签名发送回服务器。
  5. 服务器用公钥验证这个签名。如果验证成功,说明客户端持有匹配的私钥,服务器允许客户端登录。

在实际操作中,用户首先需要在本地计算机上使用 SSH 客户端生成密钥对,然后将生成的公钥放置到想要访问的服务器的相应账户下。私钥应该妥善保存在本地计算机上,并且应尽可能设置密码保护,避免未授权访问。

总的来说,公钥可以看作锁,而私钥就是打开这把锁的钥匙。公钥可以放在服务器上,谁都可以看到(用于上锁),但只有拥有私钥的人才能解开(认证成功)。在 SSH 安全模型中,所用密钥对的加密算法通常是 RSA 或 ECDSA 等。

SSH 公钥和私钥的生成通常通过使用 ssh-keygen 命令行工具进行。当生成一个密钥对时,公钥和私钥会自动具有绑定的关系,因为它们是同时生成的,并且是数学上互相对应的。以下是生成和使用密钥对的一般步骤:

生成 SSH 密钥对:

  1. 打开终端。
  2. 输入命令 ssh-keygen 并按回车键。
  3. 系统将会提示你选择保存密钥对的位置。如果接受默认位置(通常是 ~/.ssh/id_rsa),直接按回车键。
  4. 系统会问你是否要设置一个密码保护私钥。如果想要设置密码(这一步是可选的,但为了安全性,建议设置),输入你的密码并确认;否则直接按回车键。
  5. 密钥对生成完毕后,私钥保存在了指定位置,而公钥(通常是私钥文件名后加 .pub 扩展,例如 ~/.ssh/id_rsa.pub)也会在同一目录下生成。

将公钥添加到远程服务器:

  1. 需要将你的公钥内容复制到远程服务器上你账户的 ~/.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 - newusernamemkdir ~/.sshtouch ~/.ssh/authorized_keyschmod 700 ~/.sshchmod 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远程连接服务器:

  1. 打开 VS Code。
  2. 确保已经安装了 Remote - SSH 扩展。
  3. 按下 Ctrl+Shift+P 或 F1 打开命令面板。
  4. 输入并选择 "Remote-SSH: Open Configuration File"。
  5. 在打开的 SSH 配置文件中添加以下内容:
Host my-ubuntu-serverHostName my-ubuntu-serverUser ubuntuIdentityFile C:/Users/id_rsa

注意,在 Windows 中您应使用正斜杠 / 或者双反斜杠 \\ 作为路径分隔符。

  1. 保存配置文件并关闭。
  2. 在 "远程资源管理器" 面板中,找到 "SSH TARGETS" 部分下的 "my-ubuntu-server"。
  3. 点击它以尝试连接到远程服务器。

确保在远程服务器上 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.comHostName github.comUser gitIdentityFile ~/.ssh/your_private_keyIdentitiesOnly 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 服务器,并且私钥保存在你配置的位置。


https://www.xjx100.cn/news/3365999.html

相关文章

C# 系统学习(框架学习)

WPF实例讲解&#xff1a;创建一个简单的计数器应用 Step 1&#xff1a;创建WPF项目 打开Visual Studio&#xff0c;新建一个WPF应用程序项目。在MainWindow.xaml中添加一个按钮和一个标签控件&#xff0c;用XAML表示如下&#xff1a; <Window x:Class"SimpleCounter…

【Qt】使用Qt实现Web服务器(九):EventSource+JSON实现工业界面数据刷新

1、效果 效果如下,实时刷新温度、湿度 2、源码 2.1 index.html <html><body> <!-- 页面布局,本人对HTML标签不熟悉,凑合看吧 --> <div><label for

Hive安装配置

1 在conf目录下vim 创建hive-site.xml <?xml version"1.0"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <configuration><property><name>javax.jdo.option.ConnectionURL</name>&l…

Qt5.15以上版本在线安装步骤,可选择更多早期版本

以ubuntu系统为例&#xff1a; 1、先去下载在线安装程序&#xff1a; https://download.qt.io/official_releases/online_installers/ 选择合适的版本&#xff0c;这里是在x64机器的ubuntu虚拟机里安装QT&#xff0c;所以选择如下版本&#xff1a; 或者直接在终端执行如下命令…

FPGA的串口的收发程序设计

module uart_tx(input clk,input rst,input start,input [7:0] data,output reg tx_done,output reg tx_out );// 定义状态机的状态typedef enum logic [2:0] {IDLE, START, DATA, STOP} state_t;reg [10:0] count; // 用于计数发送的位数reg [2:0] state; // 用于记录…

C++初学者:像C#一样写代码,示例程序 RViewer

今天用自己写的窗口类&#xff0c;做了一个程序&#xff0c;用于控制远程电脑 &#xff0c;方便自己的工作。 学习编程的目的&#xff0c;就是为了写程序&#xff0c;做出自己软件。于是&#xff0c;我首先要做的事情是编写一个软件&#xff0c;实现了以下几个功能&#xff1a…

【解决问题】排查linux手动删除文件,但是文件标记为deleted,资源未释放

背景&#xff1a; 生产环境我们把程序生成的数据文件手动删除后&#xff0c;但是空间并没有释放&#xff0c;导致硬盘被占用&#xff0c;不够用 问题排查&#xff1a; 1.查看占用文件状态 使用命令&#xff1a; lsof | grep deleted 查看 文件已经删除了&#xff0c;但是都是…

sqlserver ‘INSTR‘ 不是可以识别的 内置函数名称。

在SQL Server中&#xff0c;INSTR 函数对应的功能通常可以使用 CHARINDEX 函数来实现。CHARINDEX 函数用于在字符串中查找子串&#xff0c;并返回子串的起始位置&#xff08;如果找不到&#xff0c;返回0&#xff09;。 解决方法&#xff1a; 将SQL查询中的 INSTR 函数替换为…