从Servlet访问SSL私钥

3
我正在本地运行Apache Tomcat,并使用OpenSSL安装了自签名证书。我还有一个servlet在运行。
我的目标是:servlet接收POST参数,然后使用服务器的PrivateKey对参数进行签名并返回。也就是说,将输入参数视为整数并将其提升到私钥的幂。
问题是:是否可以从servlet访问服务器的PrivateKey?如果在其他托管上部署,则可能无法直接访问它。那么,有没有办法请求服务器使用其PrivateKey“签署”某些数据?
谢谢您的帮助。
4个回答

2
如果我在编写web服务器,我会尽最大努力防止代码从证书存储中读取 - 我肯定不会为此提供API调用!
通常,证书以文件的形式存储在Web服务器的文件系统上(并非总是如此),但对于具有任何严重安全性的站点,这将被加密并需要密码短语进行解密。由于您使用的是自签名证书,因此可能未加密 - 只需从文件中导入证书到密钥库即可。

没错!一个可以访问Web服务器私钥的应用程序可能会使用它来执行像中间人攻击这样的恶意行为。 - David Gelhar
@David Gelhar,确实,如果您允许应用程序访问服务器的私钥,则需要足够信任该应用程序,但如果服务器专用于该应用程序(并且您像信任服务器管理员一样信任部署它的人),则可能是这种情况。如果您不信任Web应用程序开发/部署者拥有密钥,那么确保不要让其访问。否则,我不确定它怎么会被认为是“中间人攻击”,因为服务器/容器通常位于客户端和Web应用程序之间。 - Bruno
我的意思是应用程序开发人员可以在中间人SSL攻击过程中使用服务器的私钥,其中第三方设备拦截旨在发送到服务器的SSL流量(例如通过DNS欺骗),并窃听流量(或修改流量)。 应用程序本身不会成为“中间人”,但其对私钥的访问将使冒充成功。 是的,如果服务器专用于单个应用程序,则这个问题就不那么重要了。 - David Gelhar

1

这取决于容器的配置方式。通常情况下,容器的SSL配置对其中包含的servlet不可访问。例如,在Apache Tomcat中,该连接器的SSL配置可以完全独立于servlet可访问的设置(此外,SSL可能由APR或Apache Httpd前端处理,这与Java密钥库配置没有太大关系)。

如果使用javax.net.ssl.*属性进行配置,则可能能够访问密钥库。但是,这并不一定是服务器连接器的SSLContext从中进行配置的方式。在生产环境中也不建议通过命令行传递这些参数。

您可能能够做的是从您的servlet中加载容器使用的密钥库,但是您必须事先知道其位置。此外,我假设托管服务将运行启用了安全管理器的Tomcat,这可能会阻止您这样做。

请注意,您可以使用自己的密钥库,在 Web 应用程序中提供(甚至可以从类路径作为资源流加载)。这个密钥库是否包含与服务器 SSL 层使用的私钥相同的私钥取决于服务器管理员(如果他们允许您拥有它)。

0
如果您使用Java密钥库,只要你的servlet知道密钥库的位置和密码,就可以从中访问它。

0

Servlet 可以访问您计算机上的任何数据,包括密钥。唯一可能的情况是 Apache 和 Tomcat 运行在不同的用户名下,并且密钥被锁定只能由 Apache 用户名访问。在这种情况下,您可以通过 su 一个进程在 Apache 用户名下运行并读取文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接