SSH-原理

社内研修,重新整理了一下SSH的原理
(如果有不正确的地方,请留言指出,以后完善。)

基础

概念

SSH 是 Secure Shell 的缩写,提供了安全性的远程访问别的机器的机制。

目的

相比Telnet和Ftp实现,安全的数据传输

如何实现安全

加密的两种方式,对称加密非对称加密
对称加密;方法使用同一个密钥,一旦泄露,所有的安全均不可靠
非对称加密;使用公钥和私钥的两个密钥,只能使用私钥解密
一般用非对称加密的方式实现最初的会话连接,之后再用对称加密传输数据,所以会感觉,ssh连接的时候比较慢,而传输数据会比较快一些。
非对称加密的原理;

  1. 远程服务端接受客户端连接请求,服务端将自己的公钥发给客户端
  2. 客户端使用该公钥加密自己的密码,并将码文发给服务器
  3. 服务器用私钥解密码文,并验证其合法性,将结果回送给客户端

上面的连接有一个最大的问题,就是第一步的客户端接收公钥,怎么能确认是目标服务器发送过来的呢,如果中间被拦截,第三方给我的公钥,之后的数据发送都将处于危险之中。

处理方式

解决上面的问题,不同的协议有不同的解决方式,目的就是验证服务器给的公钥合不合法?

HTTPS

该协议方式是采用 CA 认证的方式,别文整理。

SSH

在该协议中,由于公钥和私钥都是自己生成的,所以没办法进行第三方的公证。

  1. 方式一;基于口令的认证
    第一次连接服务器时,通常会有类似下面的信息

    The authenticity of host ‘127.0.0.1 (127.0.0.1)’ can’t be established.
    ECDSA key fingerprint is SHA256:t2817qI47Br/fqAMFVBYt20TZMPKcu8Rj/+U+O12345.
    ECDSA key fingerprint is MD5:3b:d5:0d:df:16:6c:15:f0:3f:e2:ed:44:f2:22:22:22.
    Are you sure you want to continue connecting (yes/no)?

    意思时,这是第一次连接该服务器,无法确认真实性,已经拿到了服务器的指纹(由于公钥太长,通常1024位,基本采用通过公钥生成hash值,传递hash的方式),要连接吗?
    选择 yes 后,认为已识别了该服务器,并追加到 known_hosts 文件中,然后输入密码,用得到的公钥加密密码,传给服务器端。

  2. 方式二;基于公钥认证
    由于每次都要输入密码进行验证,比较麻烦,可以采用一种方便的做法,免去每次都要输入密码,下面详细说明。

原理

使用key交换的方式,保证安全性。
交换原理图;
左侧-客户端
右侧-服务器
在这里插入图片描述
通过SSH命令访问服务器的时候,到底发生了什么,是怎么样连接上服务器的呢?

前提

要让服务器端允许客户端来连接,双方必须事先约定一个公开键一个私有键,
键的生成方式,可以选择客户端生成(客户端做成公开键,传给服务器),也可以选择服务器端生成(ec2等的连接方式,服务器端生成键,秘密键传给客户端)。

  1. 客户端生成private key 和 public key

    ssh-keygen -t rsa -f [文件名]
    -t 指定暗号化方式,采用rsa
    -f 指定生成的文件名,默认是 id_isa
    -N “” 指定无密码,不然设置密码后每次都要输密码

    此时同时生成两个文件 id_isa (秘密键)和 id_isa.pub (公开键)

  2. 将生成的公开键传给服务器

    scp [文件名].pub [host名]:/home/[用户目录]

  3. 服务器端将公钥保存到文件 ~/.ssh/authorized_keys

这样客户端的准备工作都已经完成,AWS是生成秘密键之后,通过下载的方式把秘密键保存在客户端,AWS做好了ec2-user和公开键的匹配

流程

  1. 客户端通过命令访问服务器

    ssh [用户名]@[服务器名]

  2. 服务器接到请求后,先在 authorized_keys 中匹配客户端的公钥pubKey,生成一个随机数R,然后用客户端的公钥加密随机数作成暗号pubKey®,传给客户端
  3. 客户端用私钥解密得到随机数R,然后利用MD5生成随机数R和会话sessionId的摘要,发送给服务器
  4. 服务器端采用同样的MD5方式对随机数R和sessionId生成摘要,验证客户端传来的摘要和自己生成的摘要是否一致,实现验证

最简便的连接

如何简化每次都要在命令中指定名用户和密码连接,直接输入服务器名连接
修改文件
~/.ssh/config

Host [host名,用户名等]
HostName [host名]
User [用户名]
IdentityFile ~/.ssh/[privateKey文件名]

ssh [host名,用户名等]

<think>我们正在处理用户的问题:如何使用ssh-add命令将SSH密钥添加到ssh-agent。根据引用,ssh-add命令用于将私钥添加到SSH认证代理(ssh-agent)中,这样在连接远程服务器时就不需要重复输入密码。步骤:1.首先确保ssh-agent正在运行。如果未运行,需要先启动ssh-agent。2.使用ssh-add命令添加私钥文件。根据引用[2]:如果执行ssh-add时遇到错误“Could notopen aconnection toyour authenticationagent.”,则需要先启动ssh-agent。启动ssh-agent的方法(针对不同环境):-在Linux或macOS中,通常使用:eval "$(ssh-agent -s)"-在Windows的Git Bash中,可以编辑bash.bashrc文件(需要管理员权限)来设置自动启动(引用[3])。具体步骤:1.启动ssh-agent(如果尚未运行):在终端中执行:eval "$(ssh-agent -s)"这会输出类似“Agent pid12345”的信息,表示ssh-agent已在后台运行。2.使用ssh-add添加私钥:基本命令:ssh-add<私钥文件路径>例如:ssh-add~/.ssh/id_rsa注意:-如果不指定私钥文件路径,ssh-add会默认添加~/.ssh/id_rsa,~/.ssh/id_dsa, ~/.ssh/id_ecdsa,~/.ssh/id_ed25519等。-添加时需要输入私钥的密码(如果私钥有设置密码)。3.验证是否添加成功:使用命令:ssh-add-l会列出当前已添加的所有私钥。另外,引用[3]提到在Windows的Git Bash中每次启动都需要运行ssh-agent和ssh-add的问题,可以通过修改bash.bashrc文件(在Git安装目录的etc文件夹下)来避免重复操作。在文件末尾添加:eval "$(ssh-agent -s)"ssh-add ~/.ssh/id_rsa#或者你的私钥路径但注意:这样会将私钥密码存储在文件中,存在安全风险。另一种方法是使用ssh-agent的配置文件或使用无密码的私钥(但也不安全)。安全提示:使用ssh-agent可以避免重复输入密码,但请确保你的私钥设置了强密码,并且不要将私钥暴露给他人。因此,回答用户问题的步骤:1.启动ssh-agent(如果未运行)。2.使用ssh-add命令添加私钥。示例(在Linux/macOS终端或WindowsGit Bash中):$ eval"$(ssh-agent-s)"$ ssh-add ~/.ssh/id_rsa如果私钥有密码,会提示输入密码。如果用户遇到问题,比如ssh-agent未运行,则按照引用[2]的方法先启动。根据引用[4]和[5],ssh-add的作用是简化认证过程,提高安全性(私钥在内存中)和便捷性。生成相关问题:1.如何为SSH密钥设置密码?2.如何从ssh-agent中移除已添加的密钥?3.ssh-agent在系统重启后还会保留密钥吗?4.如何在不同操作系统上配置ssh-agent自动启动?5.使用ssh-agent有哪些安全注意事项?</think>### 如何使用 `ssh-add` 命令将 SSH 密钥添加到 `ssh-agent` #### 步骤详解 1. **启动 `ssh-agent`(若未运行)** - 在终端执行: ```bash eval "$(ssh-agent -s)" ``` - 输出示例:`Agent pid 12345`(表示 `ssh-agent` 已启动)[^2] - **原理**:`ssh-agent` 作为后台进程管理私钥,`eval` 命令将其环境变量注入当前会话[^5]。 2. **添加 SSH 私钥到 `ssh-agent`** - 执行命令(替换 `~/.ssh/id_rsa` 为你的私钥路径): ```bash ssh-add ~/.ssh/id_rsa ``` - 若私钥有密码,会提示输入一次密码[^4]。 - 成功后无提示(可通过 `ssh-add -l` 验证)[^1]。 3. **验证添加结果** - 查看已加载的私钥列表: ```bash ssh-add -l ``` - 输出示例:`256 SHA256:AbCdEf... user@host (ED25519)`[^4]。 4. **(可选)配置自动加载** - **Windows Git Bash**:编辑 `Git安装目录/etc/bash.bashrc`,末尾添加: ```bash eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa # 修改为你的私钥路径 ``` - 需管理员权限保存[^3]。 - **Linux/macOS**:在 `~/.bashrc` 或 `~/.zshrc` 中添加相同命令。 #### 常见问题解决 - **错误:`Could not open a connection to your authentication agent`** ➠ 原因:`ssh-agent` 未运行。 ➠ 解决:先执行 `eval "$(ssh-agent -s)"`[^2]。 - **私钥路径错误** ➠ 确认路径:默认私钥为 `~/.ssh/id_rsa`(RSA)或 `~/.ssh/id_ed25519`(ED25519)。 #### 作用与原理 - **作用**: - 缓存解密后的私钥,避免每次连接重复输入密码[^1][^4]。 - 提升 SSH/SCP 操作效率(如 Git 推送、远程登录)[^4]。 - **原理**: `ssh-agent` 在内存中托管私钥,SSH 客户端通过环境变量 `SSH_AUTH_SOCK` 与其通信,无需直接访问私钥文件[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值