基于ssh密钥对,如何从私钥提取公钥?

ssh-keygen

OpenSSH 私钥(id_rsaid_ed25519 等),最简单的方法是:

1
ssh-keygen -y -f /path/to/id_private > /path/to/id_private.pub

-y 会从私钥输出 OpenSSH 格式的公钥(可直接放到 ~/.ssh/authorized_keys)。


按私钥格式

1) OpenSSH 私钥(RSA / ECDSA / Ed25519 等)

命令(通用):

1
2
3
4
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

# 或 ed25519:
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub
  • 若私钥有 passphrase,会提示输入。
  • 生成的 .pub 可直接用于 authorized_keys 或上传到 Git 服务等。

验证公钥 fingerprint:

1
ssh-keygen -lf ~/.ssh/id_rsa.pub

把公钥加入远端 authorized_keys

1
cat ~/.ssh/id_rsa.pub | ssh user@host 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

2) PEM 格式 RSA 私钥

如果是 -----BEGIN RSA PRIVATE KEY-----(PEM):

  • 也可以用 ssh-keygen -y(OpenSSH 的私钥通常也能用)。
  • 或用 OpenSSL 先导出公钥(PEM 格式):
1
openssl rsa -in private.pem -pubout -out public.pem

这会生成 PEM 格式的公钥(public.pem),若你需要 OpenSSH 单行公钥格式(ssh-rsa AAAA...),推荐直接用 ssh-keygen -y -f private.pem(如果可用)。
ssh-keygen -y 不兼容,再用 openssl + 转换工具(见下)——但通常不必复杂化。


3) 私钥是 PuTTY 的 .ppk

在 Windows / Putty 生态中:

1
2
3
4
5
# 使用 puttygen(Windows / Linux 有 putty-tools)
puttygen privatekey.ppk -L # 仅打印 OpenSSH 公钥到 stdout

# 或导出到文件
puttygen privatekey.ppk -O public-openssh -o id_rsa.pub

4) 私钥是 PKCS#8(新格式)

如果私钥是 PKCS#8(通常以 BEGIN PRIVATE KEY),ssh-keygen -y 多数情况下也能处理:

1
ssh-keygen -y -f pkcs8_key > pkcs8_key.pub

若遇到兼容性问题,可先用 openssl 转回传统格式再处理。


把 PEM 公钥转为 OpenSSH 单行格式

如果你已经有 public.pem(PEM 格式公钥),想要 OpenSSH 的 ssh-rsa AAAA... 格式,可以尝试:

1
ssh-keygen -i -m PKCS8 -f public.pem > id_rsa_from_pem.pub

(兼容性依发行版与 ssh-keygen 版本不同;通常 ssh-keygen -y -f privatekey 更稳妥)


示例

1
2
3
4
5
6
7
8
# 1) 提取(OpenSSH 私钥)
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

# 2) 查看 fingerprint
ssh-keygen -lf ~/.ssh/id_rsa.pub

# 3) 上传并追加到远端 authorized_keys(安全权限)
cat ~/.ssh/id_rsa.pub | ssh user@host 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'

注意事项(要点)

  • 不要把私钥传到远端/公共地方;只在本机提取公钥并传输公钥。

  • 生成后检查权限:

    1
    2
    chmod 600 ~/.ssh/id_rsa
    chmod 644 ~/.ssh/id_rsa.pub
  • 若私钥被盗或泄露,立即废弃(从 authorized_keys 删除旧公钥,重新生成密钥对)。

  • SSH agent:如果私钥加了 passphrase,可用 ssh-add 加载到 agent,提高交互体验。

  • 在自动化脚本中谨慎处理带密码的私钥(避免明文写入脚本)。

  • 对于生产强合规/安全场景,推荐使用 Ed25519(更小、更安全)或使用硬件密钥(YubiKey)。