1. 生成密钥

cmd/bash 等皆可,只要安装了openssh。

ssh-keygen -t rsa -b 4096 -C "[email protected]"

ssh-keygen 命令选项

选项 描述
-t 指定生成密钥的类型,默认使用 SSH2d 的 RSA。
-f 指定生成密钥的文件名,默认是 id_rsa(私钥为 id_rsa,公钥为 id_rsa.pub)。
-b 指定密钥长度(bits),RSA 最小要求 768 位,默认是 2048 位;DSA 密钥必须是 1024 位(FIPS 1862 标准规定)。
-C 添加注释。
-P 提供旧密码,空表示不需要密码(-P '')。
-N 提供新密码,空表示不需要密码(-N '')。
-R hostname known_hosts 文件中删除所有属于 hostname 的密钥(known_hosts 文件在第一次连接时会自动生成在家目录的 .ssh 目录下)。
-e 读取 OpenSSH 的私钥或公钥文件。
-i 读取未加密的 SSH-v2 兼容的私钥/公钥文件,然后在标准输出设备上显示 OpenSSH 兼容的私钥/公钥。
-l 显示公钥文件的指纹数据。
-q 静默模式。

示例用法

  1. 生成默认 RSA 密钥对

    # 现在推荐ed25519类型
    ssh-keygen -t rsa -b 2048 -C "[email protected]"
    
  2. 指定密钥文件名

    ssh-keygen -f ~/.ssh/my_key
    
  3. 生成无密码的密钥对

    ssh-keygen -t rsa -N '' -f ~/.ssh/no_pass_key
    
  4. 显示公钥指纹

    ssh-keygen -l -f ~/.ssh/id_rsa.pub
    
  5. 删除 known_hosts 中的某个主机

    ssh-keygen -R example.com
    
  6. 更改密码

ssh-keygen -p -f C:\Users\user\.ssh\id_rsa

通过这种格式,可以更清晰地理解每个选项的作用及其用法。


2. 上传到远程服务器

2.1 手动复制

mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "your_public_key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

2.2 ssh-copy-id

ssh-copy-id remote_username@server_ip_address

用户通过身份验证后,公钥将附加到远程用户 authorized_keys 文件。

2.3 Get-content

如果没有ssh-copy-id,也可以曲线救国。

Get-content .\.ssh\id_rsa.pub | ssh -p 2222 [email protected] "mkdir -p .ssh && cat >> .ssh/authorized_keys"

3 使用原有密钥对

将原有的 SSH 密钥对(通常是 id_rsa 和 id_rsa.pub 或 id_ed25519 和 id_ed25519.pub)复制到新系统的目录下。

3.1 Linux系统

目录: ~/.ssh/

方法 1:通过 SCP 复制

如果旧系统可以通过 SSH 访问,可以使用 scp 命令将密钥复制到新系统:

scp user@旧系统IP:~/.ssh/id_ed25519* ~/.ssh/

方法 2:手动复制

如果旧系统无法通过 SSH 访问,可以将密钥文件通过 U 盘、云存储等方式手动复制到新系统的 ~/.ssh/ 目录。

设置密钥权限

SSH 对密钥文件的权限要求非常严格,需要确保私钥文件的权限为 600,公钥文件的权限为 644

设置私钥权限

chmod 600 ~/.ssh/id_ed25519

设置公钥权限

chmod 644 ~/.ssh/id_ed25519.pub

设置 .ssh 目录权限

chmod 700 ~/.ssh

4. 配置 SSH 客户端

确保 SSH 客户端知道如何使用这些密钥。

编辑 SSH 配置文件

打开或创建 ~/.ssh/config 文件(如果Winows则为C:\Users\username\.ssh\config或者C:\ProgramData\ssh\ssh_config):
添加以下内容(根据你的密钥类型和远程主机配置):

Host ssh1
  HostName 192.168.1.123
  Port 22
  User root
  IdentityFile ~/.ssh/id_rsa

Host ssh2
  HostName 192.168.5.32
  Port 222
  User username
  IdentityFile C:\Users\username\.ssh\id_rsa

...

保存并退出编辑器。


5. 测试 SSH 连接

使用以下命令测试 SSH 连接:

ssh -T [email protected]