跳到主要内容

ssh 密钥管理

安装工具包

# 基于apt的发行版(如Debian、Ubuntu、Raspbian、Kali Linux等)
sudo apt-get update && sudo apt-get install openssh-client

# 基于yum的发行版(如RedHat,CentOS 7等)
sudo yum update && sudo yum install openssh-clients

# 基于dnf的发行版(如Fedora,CentOS 8等)
sudo dnf update && sudo dnf install openssh-clients

# 基于apk的发行版(如Alpine Linux)
sudo apk add --update openssh

# 基于pacman的发行版(如Arch Linux)
sudo pacman -Syu && sudo pacman -S openssh

# 基于zypper的发行版(如openSUSE)
sudo zypper ref && sudo zypper in openssh

# 基于pkg的FreeBSD发行版
sudo pkg update && sudo pkg install openssh

# 基于pkg的OS X/macOS发行版
brew update && brew install openssh

ssh-keygen 密钥生成

常用参数

选项说明
-b指定密钥的位大小,例如 2048 或 4096 位
-t指定密钥的类型,常见的有 rsa、dsa、ecdsa 或 ed25519
-C为密钥添加一个注释信息
-f指定生成密钥文件的文件名
-N提供一个新密钥的密码短语
-p更改私钥的密码短语
-q安静模式,不输出任何信息
-m指定私钥导出格式

基本使用

ssh-keygen -C "this is a pub key"
# -t 指定密钥类型,默认是rsa,可以省略,推荐ed25519
# -C 设置注释文字
# -f 指定生成密钥名
# -b 密钥大小
ssh-keygen -t rsa -b 2048 -C "your_email@example.com或特定描述信息" -f ~/.ssh/git_rsa

更改密钥的密码

# -p 系统会提示你输入旧密码,然后输入新密码。
# -f 指定私钥文件
ssh-keygen -p -f ~/.ssh/id_rsa

生成一对不带密码短语的密钥

# -N 选项后跟一个空字符串,表示生成的密钥对将不会有密码短语。
ssh-keygen -t rsa -b 2048 -C "your_email@example.com" -N ""

公钥添加到远程服务器

# -i 指定复制的公钥 将公钥复制到远程服务器的 authorized_keys 文件中,以便于无密码登录,一般位于~/.ssh/中
# 另外known_hosts是服务端记录客户连接的密钥信息
# user@remote-host 目标主机
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote-host

# 添加之后客户端可以指定私钥进行连接
# -i 验证文件
ssh -i ~/.ssh/id_rsa user@remote-host

创建一个只用于认证的 SSH 密钥

# -O 指定参数,只用于认证
ssh-keygen -t rsa -b 2048 -C "your_email@example.com" -O use-only-for-authentication=yes

生成密钥时指定密钥的有效期

# -V 指定有效期
# +52w 在52周内有效
ssh-keygen -t ed25519 -C "temporary_key" -V +52w

ssh-add 密钥管理

ssh-add [选项] [密钥私钥文件...]

基本参数

选项说明
-D删除 ssh-agent 中的所有私钥
-d删除指定的私钥
-e指定一个已经存在的 PKCS#11 共享库
-l列出 ssh-agent 中所有私钥的指纹
-L列出 ssh-agent 中所有公钥
-s添加指定的 PKCS#11 共享库
-t为添加的私钥设置生存周期
-X解锁 ssh-agent
-x锁定 ssh-agent

添加默认私钥

ssh-add

添加特定私钥

ssh-agent bash
ssh-add ~/.ssh/my_other_rsa

# 或者设置config文件
vim ~/.ssh/config
Host github.com
HostName github.com
PreferredAuthentications publickey
ServerAliveInterval 30 # 每30秒发送心跳包检测连接
ServerAliveCountMax 3
IdentitiesOnly yes # 关键配置:只使用指定的私钥,不尝试其他密钥
IdentityFile ~/.ssh/my_other_rsa
User SCO777

Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
ServerAliveInterval 30 # 每30秒发送心跳包检测连接
ServerAliveCountMax 3
IdentitiesOnly yes # 关键配置:只使用指定的私钥,不尝试其他密钥
IdentityFile ~/.ssh/my_other_rsa
User scorpion777

Host gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
ServerAliveInterval 30 # 每30秒发送心跳包检测连接
ServerAliveCountMax 3
IdentitiesOnly yes # 关键配置:只使用指定的私钥,不尝试其他密钥
IdentityFile ~/.ssh/my_other_rsa
User xxx

Host codeup.aliyun.com
HostName codeup.aliyun.com # 实际的主机名或IP地址
PreferredAuthentications publickey
ServerAliveInterval 30 # 每30秒发送心跳包检测连接
ServerAliveCountMax 3
IdentitiesOnly yes # 关键配置:只使用指定的私钥,不尝试其他密钥
IdentityFile ~/.ssh/my_other_rsa
User xxx


Host codeup.aliyun.com # 主机别名,用于ssh连接时使用
HostName codeup.aliyun.com # 实际的主机名或IP地址
User git # 登录用户名,Git服务固定使用git用户
Port 22 # SSH端口号,默认22,可省略
IdentityFile ~/.ssh/id_aliyun # 指定使用的私钥文件路径
IdentitiesOnly yes # 关键配置:只使用指定的私钥,不尝试其他密钥
PreferredAuthentications publickey # 优先使用公钥认证方式
TCPKeepAlive yes # 保持TCP连接,防止超时断开
ServerAliveInterval 30 # 每30秒发送心跳包检测连接
ServerAliveCountMax 3 # 最多发送3次心跳包无响应则断开
Compression yes # 启用压缩,提高传输效率(网络慢时有用)
LogLevel ERROR # 日志级别设为ERROR,减少连接时的输出信息
StrictHostKeyChecking accept-new # 自动接受新的主机密钥,但会验证已有密钥
# ConnectTimeout 10 # 连接超时时间(秒),注释掉表示使用默认值
# ControlMaster auto # 启用连接共享,可加速多个连接
# ControlPath ~/.ssh/%r@%h:%p # 连接共享的socket文件路径
# ControlPersist 10m # 连接共享保持时间



# 全局心跳保活
Host *
ServerAliveInterval 60
ServerAliveCountMax 3

添加私钥并设置过期时间

ssh-add -t 1h ~/.ssh/my_other_rsa

列出密钥

# 列出所有私钥指纹
ssh-add -l
# 列出所有公钥
ssh-add -L

删除密钥

# 删除特定私钥
ssh-add -d ~/.ssh/my_other_rsa
# 删除特定公钥
ssh-add -d <公钥内容>

# 清除ssh-agent中的所有公钥
ssh-add -D

ssh-keyscan 收集公钥

基本参数

选项描述
-H将主机的 SSH 公钥的散列打印到标准输出。
-p指定端口号。
-t指定要收集的密钥类型。常见的有 rsa, dsa, ecdsa, ed25519。
-T设置超时时间,默认为 5 秒。
-v详细模式,显示详细的调试信息。

收集单个主机的 SSH 公钥

ssh-keyscan example.com

# 收集多个
ssh-keyscan host1.example.com host2.example.com

指定端口号收集 SSH 公钥

ssh-keyscan -p 2222 example.com

收集特定类型的 SSH 公钥

ssh-keyscan -t rsa example.com

使用散列值输出

ssh-keyscan -H example.com

详细模式收集 SSH 公钥

ssh-keyscan -v example.com

设置超时时间

ssh-keyscan -T 10 example.com

拷贝公钥到指定主机

# 拷贝公钥到远程连接主机
ssh-copy-id -i /root/.ssh/id_rsa.pub root@compute3
# 添加私钥到本地主机的ssh-agent缓存中
ssh-add ~/.ssh/id_rsa
# 批量导入
find ~/.ssh/ -type f ! -name "*.*" -exec ssh-add {} /;
# 如果无法执行,则需要ssh-agent服务启动
ssh-agent bash # 进入到ssh-agent bash,再执行ssh-add
# 或者配置.bashrc
ssh-agent # 获取到信息
SSH_AUTH_SOCK=/tmp/ssh-XXXXXXWTB2ce/agent.2727160; export SSH_AUTH_SOCK;
SSH_AGENT_PID=2727161; export SSH_AGENT_PID;
# 拷贝到 .bashrc里
source ~/.bashrc

测试连接

ssh -T git@github.com

# -v 调试模式,打印日志
ssh -v -p port username@ip