# SSH舍弃密码，拥抱密钥
## 前提条件
使用**ROOT**用户（普通用户请自己加sudo）、客户端使用Windows PowerShell终端、服务端使用Debian12+或是Ubuntu24+
## 客户端操作
### 创建密钥对
随便在哪按 WIN + X 再按 I 打开PowerShell终端 
进入用户的.ssh文件夹
```shell
cd ~\.ssh
```
创建密钥对，使用椭圆加密算法，相比RSA更加短小精悍
```shell
ssh-keygen -t ed25519
```
输出Enter file in which to save the key，是对密钥对进行命名，我这里输入test
之后输出Enter passphrase (empty for no passphrase)，是对私钥进行加密，输入私钥的密码（不会显示），不设置就按Enter跳过
然后确认密码，依旧按Enter跳过
出现一个方框图形，表示创建成功
之后 ~\.ssh 文件夹中会出现一个 test 私钥文件和一个 test.pub 公钥文件
至此，客户端的操作暂时结束

## 服务端操作
### 上传公钥至服务器
#### 创建实例阶段
在创建实例阶段，如阿里云服务器，可以在**管理设置-登录凭证**中选择密钥对；**登录名**选择root；**密钥**对选择右边创建密钥对  
创建密钥对界面，密钥对名称随意；创建类型选择导入已有密钥对，  
在客户端Windows电脑中进入 ~\.ssh文件夹中，找到第一步创建的test.pub,用任意编辑器打开后，复制其内容到公钥内容框中，标签键随意，  
然后回到实例创建页面，在密钥对选择刚刚创建的密钥对即可
#### 已有服务器
使用SSH密码登录到服务器，切换到ROOT用户
```shell
sudo -i
```
##### 复制公钥到服务器
进入/root/.ssh文件夹（普通用户进入到~/.ssh文件夹中）
```shell
cd /root/.ssh           #root用户
#cd ~/.ssh               #普通用户
```
创建或编辑 authorized_keys 文件
```shell
vim authorized_keys #没有会自动创建
```
按 I 进入编辑模式，将公钥内容复制进去  
按 Esc ，输入 :wq 保存并退出

##### 编辑SSH-SERVER配置文件
进入/etc/ssh文件夹
```shell
cd /etc/ssh
```
这一步，有可能服务器没有安装SSH服务端，就没有sshd_config文件  
安装ssh服务端
```shell
apt intsall openssh-server    #安装openssh服务端   
```
验证服务状态
```shell
systemctl status ssh    #查看SSH服务运行状态，有些老版会是sshd
```
看到绿色的active（running）说明正常运行  
按Ctrl + C退回到命令行  
查看ssh目录下的文件
```shell
ls
```
看到有了sshd_config 和 sshd_config.d即可  
编辑sshd_config文件
```shell
vim sshd_config
```
同样按 I 进入编辑模式，并确保下列三个参数如下
```shell
PermitRootLogin yes           #允许使用ROOT用户登录
PubkeyAuthentication yes      #使用密钥对
PasswordAuthentication no     #禁用密码
```
按 Esc 退出编辑模式，输入 :wq 保存并退出
##### 重启SSH-SERVER服务
一般使用（老版）
```shell
systemctl restart sshd
```
不行就试试（新版）
```shell
service ssh restart
```
##### **不要断开SSH连接，防止配置有问题连接不上**
## 使用密钥对进行连接
### 直接连接
新开一个PowerShell终端
```shell
ssh -i ~/.ssh/test root@192.168.21.5
```
输出 Enter passphrase for key 提示输入私钥密码（输入的内容不会显示），之前没设置就直接按 Enter ；不出意外就可以连接上了
### 编辑config文件进行简便连接
 **注意：** 只用使用Windows的终端才能简便连接，<mark style="background: #ADCCFFA6;">使用mobaxterm等ssh软件这个配置是没用的</mark>
在Windows客户端中，进入 ~\.ssh 文件夹

```shell
cd ~\.ssh
```
使用记事本编辑config文件
```shell
noteapd config
```
格式如
```shell
Host test
  HostName 192.168.21.5
  IdentityFile ~/.ssh/test
  User root
```
如果端口不是22，则需要加上端口，如使用222端口
```shell
Host test
  HostName 192.168.21.5
  IdentityFile ~/.ssh/test
  Port 222
  User root
```
保存  
然后在PowerShell终端中就可以进行简便连接如
```shell
ssh test
```
这里的test是 config 文件 Host 后的字符，可以用Emoji表情   
**注意：** 在使用SSH密钥对克隆GitHub或是其他git相关网站时，Host最好设置为网站的域名，你问为什么？时间的教训罢了~
## 至此教程结束