目录
一、前言
因为学习需要,我去华为云上创建主机。可是我并没有一个公网IP,无法设置访问控制组,仅允许我一个人登录。通过搜索“我的IP地址”查到的基站地址也会影响到一些不相干的人。虽然说哈,也许没人会攻击我一个一穷二白的学生(可能都不知道有这样一个服务器),但还是好奇,有什么更好的办法吗
好的,ssh密钥对就是用在这里的
二、原理
(可以直接通过目录跳转到部署哦)
SSH(Secure Shell)密钥对是一种用于身份验证的加密技术,由一对非对称密钥组成:
私钥:保存在本地,绝不外泄,用于身份验证。
公钥:可公开分发,放置在远程服务器上,用于验证私钥持有者的身份。
比如:现在有两台实验用的机器,一台命名为服务器(192.168.4.215),一台命名为客户端(192.168.4.207)。之后仅会在客户端上使用ssh链接服务器,或是将客户端上将公钥传递给服务机。
平时在~/.ssh的文件一般有两个,known_hosts和authorized_keys。事先清空.ssh中的这些文件。
无法确认主机 '192.168.4.215 (192.168.4.215)' 的真实性。
ECDSA 密钥指纹为 SHA256:STfR49OGFHwf7r3ih0kxaSaY8yn4/NOGtAf+AAMuIc4。
ECDSA 密钥指纹为 MD5:98:0c:51:ff:5a:50:a3:e1:a6:13:aa:ed:79:d3:ae:cb。
警告:已将 '192.168.4.215' (ECDSA) 永久添加到已知主机列表(known_host)中。
也就是说,此时让它继续连接后,系统就会将有关于192.168.4.215的信息记录在known_hosts中。查看客户端中的known_hosts可以发现:
里面是一串公钥。也就是说,known_hosts中存储的是已知服务器的公钥。而再去查看服务器中,发现
综上:服务器验证客户端的身份,使用authorized_keys文件;而客户端验证服务器的身份,使用known_hosts文件
接下来的步骤中,将导入密钥对并绑定的操作就是替代了上面的将公钥保存到authorized_keys中。
公钥密码学基于单向函数的概念:
容易计算:用公钥加密数据
难以逆向:没有私钥的情况下解密数据
在RSA算法中,这基于大数分解难题:
-
公钥 = (n, e),其中 n = p × q(两个大质数的乘积),e是一个满足 1 < e < φ(n) 的值
-
私钥 = (n, d),其中 d 需要从 e × d ≡ 1 (mod φ(n)) 中算出,φ(n) = (p-1) × (q-1)
-
知道 n 很容易验证加密,但不知道 p 和 q 就很难解密(对于真实的4096位RSA,n有六百多位,使用世界上最快的计算机,分解也需要数百万年)
登录时的验证过程:
-
客户端声明:"我要用某个密钥登录"
-
服务器检查
authorized_keys中是否有这个公钥 -
如果有,服务器生成一个随机挑战(challenge)
-
客户端用私钥签名这个挑战
-
服务器用存储的公钥验证签名
使用shell密钥对的优点
安全性高:几乎无法通过暴力破解方式攻击。
与IP无关:密钥与服务器IP无关,便于迁移和管理。
无需记忆密码:尤其适合自动化脚本和频繁登录的场景。
三、步骤
1.在本机生成密钥对
使用下面的命令生成密钥对
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa 指定密钥类型。华为云支持的算法有:RSA、ECDSA、EdDSA
-b 4096:指定密钥长度为4096位,安全性更高。但是部分终端的部分版本可能不支持长度过大(比如xshell 5 不支持4096位密钥(当然经过测试,xshell5的密钥也不能导入))
-C是指为你的密钥添加一个注释,是可选的,但是可以写一个便于区分
我这里是在windows中生成的
接着会询问保存位置、加密等,按需输入后
PS C:\Users\***> ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\***/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\***/.ssh/id_rsa
Your public key has been saved in C:\Users\***/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:mJddHM9L8JTGidgm/C3fGam8FalCw+EcO8s9qLQMn8o ***@goodcomputer
The key's randomart image is:
+---[RSA 4096]----+
| . ooo.o |
| +++B= |
| ++*o= o|
| o o Xo..* |
| o S + Bo+.+|
| o . = *.o.|
| = + . + |
| . * . |
| E. |
+----[SHA256]-----+
生成后的位置在C:\Users\你的用户名/.ssh/id_rsa

其中
id_rsa:私钥文件
id_rsa.pub:公钥文件(可公开)
2.将公钥注入华为云主机
在华为云控制台中,找到密钥对管理

点击导入密钥对->导入公钥。找到刚刚的存放位置,选择刚刚创建的公钥(id_rsa.pub)。勾选同意,然后选择确认,这样就创建了一个密钥对。


(当然,也可以直接点旁边的创建密钥对直接创建一个密钥对,就不用之前的步骤了,但是得到私钥会经过一次网络传输,有点风险)
3.将密钥对绑定到云主机
在刚刚的页面中跳转到云服务器列表,找到需要绑定密钥的云主机,点击绑定,将密钥对绑定到需要的主机上。为了安全考虑,可以勾选“关闭密码登录方式”



4.导入密钥到终端
需要一个支持rsa 4096的shell( 如FinalShell、MobaXterm 或 PuTTY,这里使用finalshell)
导入创建的私钥(id_rsa)

新建连接。认证的方式选择公钥,点击浏览,选择刚刚导入的私钥

确定后会自行连接到连接主机,并自行通过用户认证
(这里是将云主机的信息记到自己的known_host中)


可以看到,如果刚刚勾选了“关闭密码登录方式”,此处会自动修改。也可以在这里修改
vim /etc/ssh/sshd_config


PasswordAuthentication no # 禁用密码登录
PubkeyAuthentication yes # 启用密钥认证
修改后需要重启sshd
systemctl restart sshd
(重启sshd不会影响已建立的连接)
使用SSH密钥对登录远程服务器,不仅提升了安全性,也简化了登录流程。









1393

被折叠的 条评论
为什么被折叠?



