我在本地运行Apache Tomcat并使用OpenSSL安装了自签名证书。我也有一个servlet在运行。
我想做的是以下内容: servlet接收POST参数,并将回显使用服务器的PrivateKey签名的参数。也就是说,将输入参数视为整数,并将其提高到私钥的幂。
问题:甚至可以从servlet访问服务器的PrivateKey吗?如果部署在其他托管上,则可能无法直接访问它。那么有什么方法可以请求服务器使用私钥“签署”一些数据?
提前致谢。
答案 0 :(得分:2)
如果我正在写一个weberver,我会竭尽全力阻止代码从证书库中读取 - 我当然不会为它提供API调用!
通常,证书作为文件存储在Web服务器的文件系统上(并非总是如此),但对于具有任何严重安全性的站点,这将被加密并需要密码来解密。由于您使用的是自签名证书,因此可能未加密 - 只需将证书从文件导入密钥库即可。
答案 1 :(得分:1)
这取决于容器的配置方式。在一般情况下,容器的SSL配置将无法由其包含的servlet访问。例如,在Apache Tomcat中,该连接器的SSL配置可以完全独立于servlet可访问的设置。 (此外,SSL可能由APR或Apache Httpd前端处理,例如,这与Java密钥库配置没有太大关系。)
如果使用javax.net.ssl.*
属性配置密钥库,您可能可以访问密钥库。但是,这不一定是配置服务器连接器的SSLContext
的方式。在生产环境中,在命令行上传递这些参数通常不是一个好主意。
您可以做的是从servlet加载容器使用的密钥库,但是您必须事先知道它在哪里。另外,我认为托管服务会在启用安全管理器的情况下运行Tomcat,这可能会阻止您这样做。
请注意,您可以使用自己的webstore中提供的密钥库(它甚至可以作为资源流从类路径加载)。此密钥库是否包含与服务器SSL层使用的私钥相同的私钥,取决于服务器的管理员(如果他们允许您拥有它)。
答案 2 :(得分:0)
如果您使用Java密钥库,则可以从servlet访问它,只要它知道密钥库位置和密码。
答案 3 :(得分:0)
Servlet可以访问您计算机上的任何数据,包括密钥。唯一的情况可能是Apache和Tomcat从不同的用户名运行,并且密钥被锁定只能由Apache用户名访问。在这种情况下,您可以使用Apache用户名进行处理并读取文件。