一、什么是 SSH?
SSH(Secure Shell) 是一种协议,用于在不受信任的网络传输上,进行两个计算机之间安全的数据交换。SSH 保证了身份、数据、文件的私密性和完整性。它在 UNIX、Linux 和 macOS 机器上是标配的,并在全球 90% 以上的数据中心中使用。
:::info
SSH 是 TCP 协议的上层协议。RFC 4251 指定 SSH 传输层协议也可以是其他任何可靠的数据流。
SSH 协议的默认监听端口是 22。
:::
SSH 协议的实现:OpenSSH(开源版)、商用版
1. SSH 工作原理
- 保证私密性:非对称加密
- 数据发送方:
明文 ——> 公钥 ——> 密文
- 数据接收方:
密文 ——> 公钥 ——> 明文
非对称加密算法:DSA、RSA、ECDSA、ED25519……
- 数据发送方:
- 保证完整性:哈希算法
- 数据发送方:
明文 + hash(对明文进行哈希运算) ——> 公钥 ——> 密文
- 数据接收方:
密文 ——> 公钥 ——> 明文 + hash
- 将明文 hash 运算后,与 hash 值对比
国密算法中,能够提供数据完整性的算法主要是:SM3。 国际算法中,能够提供数据完整性的算法主要是:MD5、SHA256、SHA512。
- 将明文 hash 运算后,与 hash 值对比
- 数据发送方:
- SSH client 连接 SSH server
- SSH server 将其公钥指纹发送给 SSH Client
- 公钥指纹:由于 SSH Server 的 RSA 公钥太长,对比麻烦,用哈希算法运算后短很多,对比方便。
- Client 和 Server 协商参数,并打开安全通道
-
2. SSH 应用
3. Windows 如何安装 SSH
Windows 安装 git 之后,就自带了 SSH。
- 《基于Windows 的 OpenSSH安装与配置》
二、使用案例
2.1 密码登陆
假如现在有一台服务器,域名是 konsoue.com,端口是 35000。其操作系统的用户名是 root
首次连接,不能直接建立连接,SSH server 返回公钥指纹ssh -p 35000 root@konsoue.com
The authenticity of host '[konsoue.com]:35000' can't be established.
ECDSA key fingerprint is SHA256:w19fMK505zQZ//p52tCY938UWt123456TjUc83NVWRw.
:::info known_hosts 是保存了本机用户所信赖的远程主机的公钥。Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[konsoue.com]:35000' (ECDSA) to the list of known hosts.
Connection reset by konsoue.com port 35000
linux 系统中,通常存在etc/ssh/ssh_known_hosts
。
window 系统中,通常存在C:\Users\<用户名>\.ssh\known_hosts
::: 接着会要求输入密码。Password:(enter password)
2.2 公钥登陆
使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。 :::info 所谓”公钥登录”,原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。 ::: Github 仓库,可以让我们存储自己电脑的 SSH 公钥到远程主机(Github 服务器)。
所以在我们本地电脑,需要先生成公钥。
:::info linux 系统中,存在ssh-keygen -t rsa -C 'konsoue@qq.com'
etc/ssh
window 系统中,存在C:\Users\<用户名>\.ssh
::: 我们把生成的 id_rsa.pub 公钥,存到 Github 中就可以了。
如果我们是 Linux 电脑,要连接远程电脑/服务器,可以使用如下命令,设置 公钥 到 SSH server,然后从此就可以不用密码登陆了。
如果还是不行,就打开远程主机的ssh-copy-id root@konsoue.com
/etc/ssh/sshd_config
这个文件,检查下面几行前面#
注释是否取掉。
修改后,重启远程主机的 ssh 服务。
如果我们是 Windows 电脑,由于没有 ssh-copy-id 的命令,需要用 powershell 来模拟。RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
type C:\Users\<用户名>\.ssh\id_rsa.pub | ssh -p 35000 root@konsoue.com "cat >> .ssh/authorized_keys"
可以打开window 的 cmd,用 ssh 连接远程主机,如果不需要输入密码,证明成功了。
三、Remote-SSH
Remote-SSH 扩展可以让我们在 VSCode 上,通过 SSH 连接 SSH Server(远程服务器/虚拟机/容器)。当建立连接之后。我们就可以在 VSCode 上任意操作远程电脑的文件或文件夹。
3.1 基本原理
- 本地使用 SSH 连接 Remote Machine/ VM
- Remote Machine/ VM 使用 VS Code Server 管理文件。
3.2 如何使用
- 在商店安装扩展
- 侧边栏出现一个小电脑
- 先保证你在 cmd 中,用 ssh 命令行能连接上你的 SSH Server。
- 点击设置按钮
- 选择配置文件,如选择第一个
- 配置 config 文件
Host 是会在左边展示的 Remote Server 的名称。 HostName 是 Remote Server 的 域名/ip User 是以哪个角色身份访问 Remote Server Port 是端口
- 右键点击 DevCloud,即 SSH Server
选择在当前的 VSCode 连接,还是另开一个 VSCode。
- 打开文件,会连接到 SSH Server 的文件系统,你就可以选择了
:::warning
如果事先没有使用 SSH 的公钥登陆 SSH Server,那么需要用密码登陆。
此时,会自动打开终端,要求你输入密码。该密码是你的服务器登陆的密码。
:::
参考资料
《SSH Server》
《How Does SSH Protocol Work?》
《Remote Development using SSH》
《Windows 10 OpenSSH Equivalent of ssh-copy-id》
《SSH原理与运用(一):远程登录》