SSH Key 的一点小知识

最近在写一个生成和查看 TLS 证书的工具,对加密和证书这块有了更深的认识。

最开始 OpenSSH 使用的密钥格式其实就是 OpenSSL 的格式,如果标准的 RSA 私钥。后来 OpenSSH 有了自己的格式,其实内容基本和标准的私钥没啥区别,只是里面多了个「注释Comment」部分,也就大家经常看到的公钥最后面的xxx@xxx部分。

其实密钥里面包含着公钥,当你用 OpenSSL 或 ssh-keygen 生成密钥时,其实生成的是一对私钥和公钥,非对称加密常用。二者都可以用来加密和解密,熟悉 GPG 的话应该非常了解这块,就是把公钥给别人,私钥自己保存,这样自己用私钥加密的消息所有有公钥的人都能解密,但是其他人用公钥加密的消息只有你自己用私钥解密。

在生成 SSH 密钥时,大家最常用的工具是ssh-keygen,新的版本生成的已经是 OpenSSH 格式了,某些旧的软件可能不会兼容。下面讲几个命令来了解 SSH Key 吧。

标准的 RSA 格式的密钥头为-----BEGIN RSA PRIVATE KEY-----,而 OpenSSH 密钥头为-----BEGIN OPENSSH PRIVATE KEY-----,它们二者之前可以转换,差别就是上面说的,OpenSSH 格式支持「注释」部分。

  • OpenSSL 生成密钥并导出公钥

    openssl genrsa -out private.key 4096
    openssl rsa -pubout -outform PEM -in private.key -out public.key
  • 用 ssh-keygen 导出 OpenSSH 格式的公钥

    其实 private.key 就是 .ssh 目录里的 id_rsa 。

    ssk-keygen -y -f private.key > id_rsa.pub
  • 用 ssh-keygen 生成 OpenSSH 密钥对

    ssh-keygen -t rsa -b 4096 -N "" -f id_rsa -C "user@host"
  • 用 ssh-keygen 将公钥从密钥里导出来

    ssh-keygen -y -f id_rsa > id_rsa.pub

最后推荐一下我写的 TLS 证书生成工具,基本上能满足大部分需求,将来准备支持 YAML 格式的配置文件,这样就可以一次生成多个证书了,大型项目中通常会存在需要多个并且有关联的证书。

https://github.com/chenzhiwei/certctl