Scripting 通过脚本以安全的方式生成SSH密钥对

Scripting 通过脚本以安全的方式生成SSH密钥对,scripting,ssh-keys,Scripting,Ssh Keys,我需要生成一个SSH密钥对,稍后我将在程序中使用它,因此需要它们作为字符串。不幸的是,ssh-keygen实用程序不支持将密钥写入STDOUT或类似的东西 因此,“下一个最好的方法”是让ssh-keygen将其输出写入临时文件,然后我可以将其读回程序。但是,这会造成系统中其他人读取私钥文件的风险(脚本将由web应用程序运行) 如何以安全的方式生成密钥对?没有完全安全的方法来生成用于分发的私钥;最安全的方法是让每个客户端生成其密钥对,并且只传输公钥 然而,如果您处于这样一种情况,即这根本不起作用,

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

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


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

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

然而,如果您处于这样一种情况,即这根本不起作用,并且您致力于集中生成密钥对,那么您确实有一些选择

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

否则:

  • 确保您的web应用程序或密钥生成器包装器在其自己的用户下运行(在本答案的其余部分,我将称此用户为“kguser”)
  • 使kguser拥有一个不可通过web访问的目录,权限为0700(使用chmod设置)
  • 确保密钥生成器包装器设置为“umask 0177”;这将确保它创建的所有文件都是0600(只有kguser能够读写)
  • 生成指定难以猜测(例如随机UUID)文件名的密钥
  • chmod 0600在生成密钥文件后立即保存它们,以防umask设置无法保存或更改
  • 通过SSL/TLS连接传输私钥
  • 安全地擦除私钥文件(例如Linux上的“碎片”)
  • 使用cron作业定期查找并安全地删除任何超过几分钟的私钥文件(清理由于应用程序错误、崩溃等而留下的任何文件)
  • 如果你真的很偏执,你也可以通过让你的web应用程序使用它自己的对称密钥在写入时加密,在发送给用户时解密,来确保密钥在磁盘上被加密。然而,这会导致更多的密钥管理出错,所以我不建议这样做

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