0%

一、协议原理

​ SSH全称Secure Shell协议,用于计算机间的加密通信

​ SSH由客户端与服务端组成:服务端是sshd的守护进程来监听来自客户端的请求;客户端包含ssh程序以及其他子功能程序(远程拷贝scp、远程登录slogin、安全文件传输sftp等…)

​ SSH协议实现连接的过程如下:

1651664546588

​ 准备工作:客户端A生成秘钥对,并将公钥写入服务端B的authorized_keys中。

​ 连接过程:客户端向服务端请求登录;服务端检查authorized_keys中是否有响应的公钥信息;服务端使用相应的公钥将随机数s1加密后发送给客户端;客户端将收到的密文利用私钥解密得到明文s2,并将其返回给服务端;服务端对比s1与s2

二、SSH协议下.ssh文件夹内部文件作用

​ ~/.ssh文件夹中一般会有known hosts, autherized keys, 以及多个私钥或公钥文件

windows内:

1
2
3
4
5
6
7
8
9
10
11
PS C:\Users\WilsonPC\.ssh> ls
目录: C:\Users\WilsonPC\.ssh
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2022/9/10 22:15 pubKeys
-a---- 2023/2/3 11:45 431 config
-a---- 2022/3/27 12:37 1401 id_dsa
-a---- 2022/3/27 12:37 525 id_ecdsa
-a---- 2022/3/27 12:37 432 id_ed25519
-a---- 2022/3/27 11:28 3381 id_rsa
-a---- 2023/2/20 10:20 897 known_hosts

ubuntu内:

1
2
3
# 以我自己的Ubuntu虚拟机为例
wilson@ubuntu:~/.ssh$ ls
authorized_keys id_rsa_wilsonPC-Ubuntu.pub
  1. config文件是在配置VScode远程登录ssh插件时的配置文件

  2. known_hosts记录的ssh登录过的网站所返回的公钥信息。如果首次访问的ip不存在于known_host中,系统会提示是否添加新的hosts信息。如果访问的ip在known_hosts中已经存在,系统会核对本次返回的公钥与known_hosts中记录的上次返回的公钥是否相同,如果不同则会中止连接,以此防止中间人攻击

  3. 公钥文件与authorized_keys:

1
2
PS C:\Users\WilsonPC\.ssh\pubKeys> cat .\rsa_demo.pub
ssh-rsa AAAAB3Nz...eE5w== wilson@myPC

其中,公钥文件开头为使用的协议(上图中ssh-rsa表示为使用的是rsa协议);随后的长字符串为公钥的内容;最后的wilson@myPC(用户名@IP地址——myPC在本地DNS文件中被解释为本机器的IP地址)表示可以使用这个公钥以wilson用户登录myPC地址的机器

  1. 私钥文件
    如果没有额外的配置操作,一般会使用~/.ssh目录下的默认私钥名的文件(如id_rsa, id_ecd等…)

ssh加密协议

1.RSA,DSA,ECDSA,EdDSA和Ed25519都用于数字签名,但只有RSA也可以用于加密。

  • RSA(Rivest–Shamir–Adleman)是最早的公钥密码系统之一,被广泛用于安全数据传输。它的安全性取决于整数分解,因此永远不需要安全的RNG(随机数生成器)。与DSA相比,RSA的签名验证速度更快,但生成速度较慢。

  • DSA(数字签名算法)是用于数字签名的联邦信息处理标准。它的安全性取决于离散的对数问题。与RSA相比,DSA的签名生成速度更快,但验证速度较慢。如果使用错误的数字生成器,可能会破坏安全性。

  • ECDSA(椭圆曲线数字签名算法)是DSA(数字签名算法)的椭圆曲线实现。椭圆曲线密码术能够以较小的密钥提供与RSA相对相同的安全级别。它还具有DSA对不良RNG敏感的缺点。

  • EdDSA(爱德华兹曲线数字签名算法)是一种使用基于扭曲爱德华兹曲线的Schnorr签名变体的数字签名方案。签名创建在EdDSA中是确定性的,其安全性是基于某些离散对数问题的难处理性,因此它比DSA和ECDSA更安全,后者要求每个签名都具有高质量的随机性。

  • Ed25519是EdDSA签名方案,但使用SHA-512 / 256和Curve25519;它是一条安全的椭圆形曲线,比DSA,ECDSA和EdDSA 提供更好的安全性,并且具有更好的性能(人为注意)。

2.其他说明

  • RSA密钥使用最广泛,因此似乎得到最好的支持。

  • ECDSA(在OpenSSH v5.7中引入)在计算上比DSA轻,但是除非您有一台处理能力非常低的机器,否则差异并不明显。

  • 从OpenSSH 7.0开始,默认情况下SSH不再支持DSA密钥(ssh-dss)。根据SSH标准(RFC 4251及更高版本),DSA密钥可用于任何地方。

  • Ed25519在openSSH 6.5中引入。

一、安装sshd服务

1.Ubuntu服务器安装

1
2
# Ubuntu软件源安装
sudo apt-get install openssh-server

2.Windows 10下安装

​ 如果想在windows平台上使用ssh服务,需要安装相关的ssh服务,这里以PowerShell安装OpenSSH为例,参考:安装 OpenSSH | Microsoft Docs

Step1

1
2
3
4
5
6
7
8
9
# 检查本机ssh安装情况
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
# 返回结果如下:表面我的ssh客户端与服务端都已安装完毕

Name : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name : OpenSSH.Server~~~~0.0.1.0
State : Installed

Step2

1
2
3
4
5
# 根据需要安装客户端/服务端
# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

二、配置服务端信息

sshd参考:sshd(8) - OpenBSD manual pages

1.Ubuntu系统

(1) 写入公钥

​ 在~/.ssh/authorized_keys文件中写入公钥数据(相关目录与文件可以自行创建)

注:如果是自行创建的文件,记得修改目录与文件的权限:其中.ssh 的权限应该是 700;公钥文件authorized_keys的权限应该是 644;私钥文件id_rsa的权限可以使用600

1
2
3
4
5
6
7
8
9
# 修改 .ssh 的权限为 700
cd ~
chmod 700 .ssh
# 修改 authorized_keys 的权限为 644
cd .ssh
chmod 644 authorized_keys
# 如果本机需要使用私钥
# 修改 id_rsa 的权限为 600
chmod 600 id_rsa

(2) 服务端配置文件 /etc/ssh/sshd_config

详情:(28条消息) Linux中ssh配置详解_穆瑾轩的博客-CSDN博客_linux ssh配置

配置文件路径 /etc/ssh/sshd_config, 常用配置项如下:

1
2
3
4
#PermitRootLogin no # 可以禁止root登录
RSAAuthentication yes # 开启RSA认证
PubkeyAuthentication yes # 开启公钥认证
#PasswordAuthentication no # 可以设置禁用密码登录

2.Windows 10系统

​ 启动sshd服务端:

1
2
3
4
# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic
# Now start the sshd service
Start-Service sshd

​ 启动ssh客户端连接目标机器:

1
2
3
ssh <登录使用的用户名>@目标机器IP地址
# 调试模式使用ssh————会显示调试日志信息
ssh -v <登录使用的用户名>@目标机器IP地址

三、配置客户端信息

1.Ubuntu 客户端配置

详情:(28条消息) Linux中ssh配置详解_穆瑾轩的博客-CSDN博客_linux ssh配置

​ 配置文件路径 /etc/ssh/ssh_config, 常用配置如下

1
2
3
4
5
# 可以自定义私钥文件路径
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519

2.Windows 10系统

​ 管理密钥

1
2
3
4
5
6
7
8
9
10
### 密钥管理 ###
# 使用ssh时,会自动在.ssh目录下寻找各协议默认对应的私钥文件名作为私钥用于向服务器验证身份
# 因此,需要使用ssh-agent与ssh-add命令配合才可以使用自定义名的私钥文件去验证
### ####### ###
# 设置ssh-agent服务自动启动
Get-Service ssh-agent | Set-Service -StartupType Automatic
# 手动启动ssh-agent服务
Start-Service ssh-agent
# 添加自定义私钥
ssh-add 私钥路径

四、密钥对的生成

原理:使用SSH—最新加密算法ecsda密钥认证登陆_轻描淡写的岁月的技术博客_51CTO博客

1.密钥生成: ssh-keygen指令

参考:SSH-keygen用法 - 杨浪 - 博客园 (cnblogs.com)

1
2
3
4
5
6
7
8
9
10
11
# 密钥生成:ssh-keygen
# 常用指令:
# -t 后接加密方式
# -C 后接注释(一般是邮箱 或者 用户名@机器名)
# -f 后接秘钥对的名字
# -b:指定密钥长度
### 示例 ###
ssh-keygen -b 4096 -t rsa -f rsa_demo -C wilson@wilsonPC
# 生成结果:
# 私钥文件 ./rsa_demo
# 公钥文件 ./rsa_demo.pub

2.密钥对内容解读

1
2
3
4
5
6
7
8
9
10
### 私钥 ###
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXkt...AAB93aWxzb25wY0BXSUxTT04tREVTS1RPUC12ZXIyMDE2AQI=
-----END OPENSSH PRIVATE KEY-----
### 公钥 ###
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAA.../U= wilsonpc@WILSON-DESKTOP-ver2016
# ssh-rsa 表示协议使用了rsa协议
# AAA...x/U= 公钥内容
# wilsonpc@WILSON-DESKTOP-ver2016 指令中-C wilson@wilsonPC所添加的注释内容,如果没有指定则默认为 当前用户名@当前机器名

3.公钥的使用

​ 想要使上一步中的秘钥对生效,则还需要将公钥写入服务器的authorized_keys中来使其生效

1
2
# 例如可以使用cat命令在Ubuntu服务器上将.pub内文件写入authorized_keys
cat rsa_demo.pub >> authorized_keys

一、VsCode配置ssh免密连接

Step1 VsCode安装ssh插件

1651668467972

1651668474487

Step2 VsCode设置ssh插件

1651668506066

Step3 检查服务器配置

​ 首先查看服务器IP地址:

1
2
3
4
# Linux
ifconfig
# Windows
ipconfig

​ 检查服务器sshd使用的默认22端口是否开启

1
2
3
4
5
6
# 检查22端口状态
netstat -ntlp|grep 22
# 开启22端口
sudo ufw allow 22
# 检查22端口占用状态
lsof -i:端口号

​ 配置免密登录:先通过前文生成对应的密钥对,然后根据下列步骤在服务器上

1
2
3
4
5
6
7
8
9
10
11
12
### 开启免密登录功能 ###
vim /etc/ssh/sshd_config
### 修改一下内容 ###
# 允许秘钥登录
RSAAuthentication yes
PubkeyAuthentication yes
# 允许SSH登录ROOT用户:
PermitRootLogin yes
# 禁用密码登录(建议秘钥登录成功后再禁用)
PasswordAuthentication no
### 修改完毕后重启ssh服务 ###
service sshd restart

Step4 配置ssh设置

1651668550076

​ 修改配置文件如下:

1
2
3
4
5
Host MyUbuntu-codeLearning		# Host后接SSH连接名
Port 22 # port后接端口号
HostName 192.168.61.131 # HostName后接服务器IP地址
User wilson # User为访问时希望使用的用户名
IdentityFile ~/.ssh/id_rsa_wilsonPC-Ubuntu # IdentityFile 后是秘钥存储路径

可能遇见的错误提示:

错误一:“过程试图写入的管道不存在”

笔记本链接时失败,提示:过程试图写入的管道不存在

推测原因:之前使用Putty进行SSH链接时储存了过时的信息(配置密钥后失效过)
解决方案:解决方案就是把本地的known_hosts的原服务器信息全部删掉(根据IP地址删除),然后重新连接就可以了。

详见:https://blog.csdn.net/u013066730/article/details/119924403

错误二:免密失败

​ 提示免密失败,连接时仍然提示需要输入密码

可能原因:
(1)IdentityFile 拼写错误
(2)没有正确识别私钥文件,失败提示如下:No such file or directory

二、VsCode使用跳板机实现SSH连接

问题:
使用VsCode时,如果目标机器需要经过跳板机连接,则使用VsCode远程连接插件时,插件只能读取到跳板机的设置,而真正访问目标机器则是再跳板机的terminal终端中操作,十分的麻烦

img

解决:
使用OpenSSH与VsCode的ssh config中的proxy command完成跳转
参考: VSCode Remote ssh跳板机配置(windows平台) - 知乎 (zhihu.com)

实战:
修改~/.ssh/config中内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Host SSH跳板机实验-JumpMachine
# 跳板机的ip地址
HostName 192.168.9.65
# 跳板机的用户名
User ss
# 跳板机登录端口
Port 22
IdentityFile ~/.ssh/id_rsa-sspku

Host SSH跳板机实验-TargetMachine
# 目标机的ip地址
HostName 192.168.9.59
# 目标机的用户名
User ss
# 目标机登录端口
Port 22
# 跳板指令
ProxyCommand C:\Windows\System32\OpenSSH\ssh.exe -W %h:%p SSH跳板机实验-JumpMachine
# 私钥位置(本机上的路径,不是跳板机上的路径)
IdentityFile ~/.ssh/id_rsa-sspku

注:

1.为什么一定要安装openssh?

因为在windows上VSCode使用的默认ssh工具存在实现上的问题,导致一旦我们直接使用默认ssh连接会有报错:”过程试图写入的管道不存在”(The process tried to write to a nonexistent pipe)。因此,我们务必安装openssh,并在设置ProxyCommand时使用安装好的openssh来进行连接。

2.ProxyCommand中每个参数的意义?
“-W”表示stdio forwarding模式,接着后面的%h是一个占位符,表示要连接的目标机,也就是Hostname指定的ip或者主机名。%p同样也是占位符,表示要连接到目标机的端口。这里可以直接写死固定值,但是使用%h和%p可以保证在Hostname和Port变化的情况下ProxyCommand这行不用跟着变化。

问题一:github私钥验证失败

问题描述

​ 配置好ssh私钥与公钥后,仍然无法使用ssh -T [email protected] 指令成功访问github

原因

​ 参考:https://stackoverflow.com/questions/57734669/gitgithub-com-permission-denied-publickey
​ 参考:How to run ssh-add on windows? - Stack Overflow

1
2
3
4
5
6
7
8
# 执行ssh -vT [email protected] 命令
ssh -vT [email protected]
# 返回结果中发现debug信息中值尝试了默认名的私钥文件
debug1: Will attempt key: C:\\Users\\WilsonPC/.ssh/id_rsa
debug1: Will attempt key: C:\\Users\\WilsonPC/.ssh/id_dsa
debug1: Will attempt key: C:\\Users\\WilsonPC/.ssh/id_ecdsa
debug1: Will attempt key: C:\\Users\\WilsonPC/.ssh/id_ed25519
debug1: Will attempt key: C:\\Users\\WilsonPC/.ssh/id_xmss

​ 可以看出,使用诸如OpenSSH等的ssh-agent帮助下,可以在本机注册不同名称的私钥,否则就只能选择诸如id_rsa等默认名称的私钥

解决方案

​ 方案一:将私钥名改回id_rsa即可
​ 方案二:通过ssh-add将私钥添加至ssh-agent缓存中即可(需要启动ssh-agent服务)

问题二:无法使用ssh-add命令

问题描述

​ Ubuntu上添加私钥时提示如下:

1
2
3
4
# 输入
ssh-add id_rsa_wilsonUbuntu-Git
# 显示
Could not open a connection to your authentication agent

原因:

​ 需要先执行一次ssh-agent bash激活ssh-agent,然后才能使用ssh-add添加私钥文件

问题三:ssh-add添加私钥失败

问题描述

​ 添加私钥时提示:

1
2
3
4
# 输入
ssh-add id_rsa_wilsonUbuntu-Git
# 显示
WARNING: UNPROTECTED PRIVATE KEY FILE!

原因

​ 添加的私钥文件权限不正确。参考:It is required that your private key files are NOT accessible by others_IBLiplus的博客-CSDN博客

解决方案

​ 给私钥600权限

1
chmod 600 id_rsa_wilsonUbuntu-Git