Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Servlet访问SSL私钥_Java_Apache_Servlets_Ssl - Fatal编程技术网

Java 从Servlet访问SSL私钥

Java 从Servlet访问SSL私钥,java,apache,servlets,ssl,Java,Apache,Servlets,Ssl,我在本地运行ApacheTomcat,并使用OpenSSL安装了一个自签名证书。我还运行了一个servlet 我想做的是: servlet接收POST参数,并将回显使用服务器的PrivateKey签名的参数。也就是说,将输入参数视为整数,并将其提升为私钥的幂 问题是:甚至可以从servlet访问服务器的私钥吗?如果部署在其他主机上,可能无法直接访问它。那么,有没有任何方法可以请求服务器使用其私钥对某些数据进行“签名” 提前感谢。如果您使用Java密钥库,您可以从servlet访问它,只要它知道密

我在本地运行ApacheTomcat,并使用OpenSSL安装了一个自签名证书。我还运行了一个servlet

我想做的是: servlet接收POST参数,并将回显使用服务器的PrivateKey签名的参数。也就是说,将输入参数视为整数,并将其提升为私钥的幂

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


提前感谢。

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

这取决于容器的配置方式。在一般情况下,容器的SSL配置将不会被它所包含的servlet访问。例如,在ApacheTomcat中,连接器的SSL配置可以完全独立于servlet可访问的设置。(此外,SSL可能由APR或ApacheHTTPD前端处理,例如,这与Java密钥库配置没有多大关系)

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

您可以做的是从servlet加载容器使用的密钥库,但您必须事先知道它在哪里。此外,我认为托管服务将在打开安全管理器的情况下运行Tomcat,这可能会阻止您这样做


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

如果我正在编写一个Web服务器,我会竭尽全力阻止代码从证书库读取-我当然不会为它提供API调用


通常证书作为文件存储在Web服务器的文件系统上(不总是),但对于具有任何严重安全性的站点,这将被加密,并且需要密码来解密。由于您使用的是自签名证书,它可能未加密-只需将证书从文件导入密钥库。

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

您说对了!有权访问Web服务器私钥的应用程序可能会使用它进行恶意攻击,如中间人攻击。@David Gelhar,如果允许应用程序访问服务器的私钥,确实需要充分信任该应用程序,但如果服务器专用于该应用程序,则可能会出现这种情况(你信任部署它的人,就像信任服务器管理员一样)。如果你不信任拥有密钥的webapp dev/deployer,当然,不要让它访问它。我不确定这怎么会被认为是“中间人”否则,因为它是服务器或容器,它在客户端和Web应用程序的中间。我的意思是,应用程序开发者可以在中间人SSL攻击的过程中使用服务器的私钥,其中第三方设备拦截针对服务器的SSL流量(例如,通过DNS欺骗)。和窃听流量(或修改流量)。应用程序本身不会是“中间人”,但它对私钥的访问将使模拟成功。是的,如果服务器专用于单个应用程序,这一问题就不会那么严重。