生成安全 SSH 密钥

作为软件开发人员,我们可能需要经常使用 SSH 密钥。 进行系统管理或将提交推送到 GitHub 或 GitLab 等源代码控制被认为是通过 SSH 使用公钥身份验证而不是密码的最佳实践。

而且因为我们在此学习路径中同时进行(服务器管理和将代码移动到源代码控制存储库),我们应该首先设置自己的 SSH 密钥。 如果大家已经有一个现有的密钥,请不要立即跳过并先阅读下一部分。

DSA 和 RSA 1024 已过时!

大家是否已有 SSH 密钥? 好吧,酷!

时光荏苒,SSH 密钥已过时。 如果大家很久以前生成了 SSH 密钥,则各位的密钥可能很弱,并且与远程系统的开放式不安全连接。 大家可能很幸运远程系统拒绝 DSA 或 RSA 1024 密钥,但不能依赖它。

检查 SSH 密钥

使用以下命令验证 SSH 密钥的强度。 它希望我们的 SSH 密钥位于 ~/.ssh 文件夹中。 我们应该能够在 Mac 和 Linux 上执行以下命令而不会出现任何问题。 在 Windows 上,我们可以使用“Git Bash”来支持所需的关键字。

for keyfile in ~/.ssh/id_*; do ssh-keygen -l -f "${keyfile}"; done | uniq  

输出可能如下所示:

4096 SHA256:0wGMlgS9ZM/bH0A0E1VTIOqw9eFt3RF5wOxb5hCAqgQ marcus@email.com (RSA)  
4096 SHA256:qkyWBs354/tMXxryQnV9V2zVC6/7q6SsZW8Ycp/W15E Marcus@MXC-NB04 (RSA)  

注意:此命令搜索文件名以 id_ 开头的 SSH 密钥。 如果我们的键不以该前缀开头,请调整命令。 例如,使用上面的命令将找不到名为 github 的密钥。

像这样验证我们的输出:

  • DSA 或 RSA 1024 位:不安全! 绝对是一个危险信号。
  • RSA 2048:黄旗,我们应该更新密钥
  • RSA 3072/4096:没问题。 Ed25519有一些好处!
  • ECDSA:你最好改变。
  • Ed25519:安全着陆。 如果你正在使用这个:你很幸运。

在我的机器上,我设置了多个键。 运行命令来验证所有密钥会输出如下结果:

$ for keyfile in ~/.ssh/id_*; do ssh-keygen -l -f "${keyfile}"; done | uniq

256 SHA256:M1N2O3P4 139823321@qq.local (ED25519)  
2048 SHA256:A/bcde jiyik_onmpw@163.com (RSA)  
4096 SHA256:abcde jiyik_onmpw@126.com (RSA)  

应用上面的指标,我需要关注 2048 位的 RSA 密钥。 中期,至少升级到 RSA 4096 或更好地升级到 Ed25519 要安全得多。

请注意第一个 256 位的密钥。 一开始你可能会想:嗯,把它放在验证选项列表的哪里,没有256位? 在这里,我们必须检查行尾的密钥类型:ED25519。 可以映射密钥类型,使用此密钥绝对安全 :)

如果我们使用的是 DSA 或 RSA 1024 密钥,请考虑升级! 此学习路径的目标是在生产环境中安全地自行托管自己的 Node.js 应用程序。 我们希望自己的应用程序是安全的,并且需要先从自己的机器开始。 下一节将向大家展示如何生成新的安全 SSH 密钥。


生成 SSH 密钥

在生成新密钥对期间,系统会要求我们输入密码。 此密码用于加密我们的私钥。 如果我们丢失了私钥,这应该可以保护其他人不会因为强密码而冒充我们。 确保选择的密码不容易暴力破解。

SSH 密钥生成器允许使用两种选项来抵御暴力破解密码:使用新的 RSA 密钥格式和由 bcrypt 提供支持的最新密钥派生功能。 Bcrypt 是一个密码散列函数,包含一个 salt(随机字符串)来保护我们的实际密码免受暴力攻击。

ssh-keygen -o -a 100 -t ed25519

运行 ssh-keygen 时,为新的 RFC4716 密钥格式应用 -o 选项,并将 bcrypt 作为现代密钥生成函数。 -a <num> 选项指定轮数。 使用 -t <name> 定义密钥创建方式。

在生成新密钥对时,系统会要求我们提供密码。 这是我们的密码管理器第一次展示其实力的机会。 我们无需记住的自动生成的密码。

新生成的 SSH 密钥对位于显示的目录中。 在我的例子中,它是 /Users/jiyik/.ssh/id_ed25519 。 现有的 SSH 密钥在 ~/.ssh 中的新密钥旁边。

太好了,我们已经更新或创建了最新的 SSH 密钥对。 现在我们的系统已准备好使用 SSH 安全地打开和使用与其他系统的远程连接。