在数字签名服务器上存储私钥的位置?

我正在开发一个客户端 – 服务器应用程序,需要在发送到客户端之前使用私钥对某些文件进行签名。 客户端将使用公钥validation签名。 因此,私钥需要始终在服务器上,并且可以由服务器应用程序读取。

问题是,我想知道在哪里存储我的私钥,以防万一服务器被泄露而更加安全

我是否应该将其存储在数据库中,还是应该将其存储为文件并使用文件权限进行控制?

谢谢。

Option选项是使用一个setuid二进制文件作为不同的用户来执行证书签名。

这个其他用户可以读取密钥,但“普通”应用服务器用户不具有读取权限。 因此,如果有人破坏了应用程序服务器的帐户,他们只能签署任意证书,而不能窃取CA私钥。

另一种可能是使用一些RPC机制将签名请求传递给作为另一个用户(可能在另一个主机上)运行的另一个进程。 或者在同一台主机上的其他虚拟机(但不在应用程序服务器机器内)。

这些方法中的任何一种都只是减少折衷的影响,但还是不好的。

如果密钥存储在服务器本身,那么如果该服务器被攻破,将被发现。 存储在一个数据库/文件不可能阻止这种情况 – 大多数服务器通过其运行的服务进入服务器。

一种选择是将私钥存储在称为硬件安全模块(HSM)的单独硬件模块中。 HSM根据请求生成签名,但不会将私钥泄露给服务器。 如果服务器受到攻击,他们可以在访问期间获取签名文件,但是无法获取密钥本身,并且必须保留对服务器的访问权限才能继续生成签名。 对于不频繁的应用,智能卡可以用作简单的HSM。