1

我需要生成一个 SSH 密钥对,稍后我将在程序中使用它,因此需要它们作为字符串。不幸的是,该ssh-keygen实用程序不支持将密钥写入 STDOUT 或类似的东西。

因此,“下一个最好的事情”是将ssh-keygen其输出写入临时文件,然后我可以将其读回程序中。然而,这会带来系统上其他人读取私钥文件的风险(脚本将由 Web 应用程序运行)。

如何以安全的方式生成密钥对?

4

1 回答 1

0

没有完全安全的方法来生成用于分发的私钥;最安全的方法是让每个客户端生成其密钥对并仅传输公钥。

但是,如果您处于这种情况根本行不通的情况下,并且您致力于集中生成密钥对,那么您确实有一些选择。

有硬件安全模块 (HSM) 可以为您执行此操作。如果你负担得起,这是最好的方法。

做不到这一点:

  1. 确保您的网络应用程序或密钥生成器包装器在其自己的用户下运行(我将在此答案的其余部分将此用户称为“kguser”)。
  2. 创建一个由 kguser 拥有的不可 Web 访问的目录,权限为 0700(使用 chmod 设置)
  3. 确保您的密钥生成器包装设置为“umask 0177”;这应该确保它创建的任何文件都是 0600(只有 kguser 能够读取和写入)
  4. 生成指定难以猜测(例如随机 UUID)文件名的密钥
  5. chmod 0600 生成密钥文件后立即生成它们,以防万一您的 umask 设置不保留或被更改
  6. 通过 SSL/TLS 连接传输私钥
  7. 安全擦除私钥文件(例如 Linux 上的“粉碎”)
  8. 使用 cron 作业定期查找并安全擦除任何超过几分钟的私钥文件(清理由于应用程序错误、崩溃等而留下的任何文件)

如果您真的很偏执,您还可以确保密钥在磁盘上被加密,方法是让您的 Web 应用程序使用自己的对称密钥在写入时加密并在发送给用户时解密。但是,这会打开更多的密钥管理来搞砸,所以我不推荐它。

如果您从不将该密码短语存储到磁盘上,那么在密钥上设置密码短语也会有很大帮助。如果有人确实设法恢复了受密码保护的密钥,他们仍然必须猜测密码才能使密钥有用。但是,这也意味着您的用户在使用密钥时必须提供密码——这可能是可接受的,也可能是不可接受的。

于 2012-03-07T06:53:29.433 回答