让应用程序签署文档,但不要让它看到密钥

时间:2014-12-26 01:22:40

标签: linux security digital-signature private-key

我想在Linux服务器上对文档和消息进行数字签名。如何安全地存储私钥和密码?

问题是,如果应用程序受到攻击,密钥也会受到损害。如果我可以somehow let an app sign something,但不要让它触及实际的密钥,那么这不会完全解决我的问题(因为攻击者仍然可以在一段时间内签署任何内容),但是减少了影响(比如,我们不必撤销密钥)。

例如,在SSL服务器的情况下,没有这样的问题,因为通常没有实际需要应用程序来访问密钥。因此,它们可以半安全地存储在单独的位置。例如。网络服务器(如nginx)可以读取密钥,但不能读取应用程序。

我是否在思考它?是否值得思考?

2 个答案:

答案 0 :(得分:1)

如果您有非常高的安全性需求,可以考虑将密钥移动到完全独立的服务器,或者更好的硬件安全模块(但这些是昂贵的)。就像你提到它可以帮助防止丢失密钥,但如果应用程序受到攻击,攻击者仍然可以签署他们想要的任何内容。

接下来麻烦的主要原因是审计。也就是说,如果您的签名服务器或设备保留其签署的所有内容的日志,那么如果只有您的应用程序被泄露,您将能够更好地评估损坏的程度(假设您的签名服务器没有受到损害)。 / p>

所以是的,有好处,但你的第一个重点应该放在正确保护你的主要应用程序上,因为一旦受到损害你就已经有了一个非常糟糕的好日子,即使你把钥匙转移到了sperate服务上。

答案 1 :(得分:1)

创建一个单独的轻量级签名应用程序,该应用程序侦听UNIX套接字并作为独立用户从主应用程序运行;当你的应用想要签署某个东西时,它会将该文件和任何其他信息抛出该套接字,然后返回已签名的文件。

如果应用程序受到攻击,只要他仍在服务器上,攻击者仍然可以签署文件,但除非他使用权限提升漏洞获取root权限并复制签名应用程序的密钥,他无法窃取密钥然后随意签名而无需连接到服务器。

您可以使用标准TCP套接字替换UNIX套接字,并将签名应用程序放在单独的服务器上以提高安全性;确保在签名应用程序上实现一些基本的访问控制,当然使用适当的防火墙规则来确保签名服务器永远不会暴露给互联网,或者通过应用程序调用的using a "setuid" binary for signing简化一些事情,在这种情况下,签名二进制文件将作为具有访问密钥的其他权限的其他用户运行,而webapp本身不具有此类权限。

基本上你应该实施一个基本的软件HSM。