2010-10-29 59 views
3

我在本地运行Apache Tomcat,并使用OpenSSL安装了自签名证书。我也有一个servlet在运行。从Servlet访问SSL私钥

我想要做的是以下几点: servlet接受POST参数并回显使用服务器的PrivateKey签名的参数。也就是说,将输入参数作为整数处理,并将其提升到私钥的权力。

问题:甚至有可能从Servlet访问服务器的PrivateKey?如果部署在其他主机上,则可能无法直接访问它。那么是否有任何方法可以请求服务器使用其私钥“签名”某些数据?

在此先感谢。

回答

1

这取决于容器的配置方式。在一般情况下,容器的SSL配置将不能被其包含的servlet访问。例如,在Apache Tomcat中,该连接器的SSL配置可以完全独立于servlet可访问的设置。 (另外,SSL可能由APR或Apache Httpd前端处理,例如,这与Java密钥库配置无关)。

如果使用javax.net.ssl.*属性配置它们,您可能可以访问密钥存储库。但是,这不一定是服务器连接器的SSLContext的配置方式。在生产环境中通过命令行传递这些参数通常不是一个好主意。

你可以做的是从你的servlet中加载容器使用的密钥库,但是你必须事先知道它在哪里。另外,我想假设一个托管服务会运行一个安全管理器打开的Tomcat,这可能会阻止你这样做。

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

0

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

2

如果我正在写weberver,我会竭尽全力防止从证书库中读取代码 - 我当然不会为它提供API调用!

通常,证书作为文件存储在网络服务器的文件系统中(并非总是),但对于任何具有严重安全性的网站,这将被加密并需要密码才能解密。由于您正在使用可能未加密的自签名证书,只需将文件中的证书导入密钥库即可。

+0

你说的!一个可以访问Web服务器私钥的应用程序可以用它来做一些讨厌的东西,比如中间人攻击。 – 2010-10-29 14:22:38

+0

@David Gelhar,实际上,如果你允许它访问你的服务器的私钥,你就需要足够的信任,但是如果服务器专用于那个应用程序,你可能会遇到这种情况(并且你相信谁将它部署在与您信任服务器管理员的方式相同)。如果您不信任带有密钥的Web应用程序开发人员/部署人员,当然不要让它访问它。我不确定这将如何被认为是“中间人”,否则,因为它无论如何都是位于客户端和webapp中间的服务器/容器。 – Bruno 2010-11-02 15:42:07

+0

我的意思是应用程序开发人员可以在中间人SSL攻击过程中使用服务器的私钥,其中第三方设备拦截用于服务器的SSL通信(例如,通过DNS欺骗)和窃听在交通(或修改它)。该应用程序本身不会是“中间人”,但它的私钥访问将允许模拟成功。是的,如果服务器专用于单个应用程序,则这不是一个问题。 – 2010-11-02 15:55:56

0

Servlet可以访问机器上的任何数据,包括密钥。唯一的情况可能是Apache和Tomcat从不同的用户名运行,并且锁被锁定为只能被Apache用户名访问。在这种情况下,您可以使用一个技巧来处理Apache用户名下的进程并读取该文件。