我正在开发一个客户端 - 服务器应用程序,它需要在发送到客户端之前使用私钥对某些文件进行签名。然后,客户端将使用公钥验证签名。因此,私钥必须始终位于服务器上,并且可由服务器应用程序读取。
问题在于我想知道在我的私钥存储位置哪个更安全,以防服务器泄露。
我应该将它存储在数据库中还是应该将其存储为文件并使用文件权限来控制?
感谢。
答案 0 :(得分:5)
选项选项是使用setuid二进制文件,它以不同的用户身份运行以进行证书签名。
此其他用户可以对密钥进行读访问,但“普通”应用服务器用户不具有读访问权限。因此,如果有人破坏了应用服务器的帐户,他们只能签署任意证书,而不是窃取CA私钥。
另一种可能性是使用一些RPC机制将签名请求传递给作为另一个用户运行的另一个进程,可能在另一个主机上。或者是同一主机上的另一个VM(但在内部应用服务器机器)。
这些方法中的任何一种都只是减少了妥协的影响,但它仍然很糟糕。
答案 1 :(得分:4)
如果密钥存储在服务器本身上,那么如果该服务器被泄露,则会找到该密钥。存储在数据库/文件中不太可能阻止这种情况 - 大多数服务器中断都是通过它运行的服务发生的。
一种选择是将私钥存储在称为硬件安全模块或HSM的单独硬件模块中。 HSM根据请求生成签名,但不会向服务器公开私钥。如果服务器遭到入侵,他们可以在访问期间对其进行签名,但无法获取密钥本身,并且必须保留对服务器的访问权以继续生成签名。对于不常见的应用,智能卡可以作为简单的HSM。