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