Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.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 使用ApacheHTTP客户端将TomcatWeb应用的密钥存储放在何处_Java_Tomcat_Keystore_Apache Httpclient 4.x_Truststore - Fatal编程技术网

Java 使用ApacheHTTP客户端将TomcatWeb应用的密钥存储放在何处

Java 使用ApacheHTTP客户端将TomcatWeb应用的密钥存储放在何处,java,tomcat,keystore,apache-httpclient-4.x,truststore,Java,Tomcat,Keystore,Apache Httpclient 4.x,Truststore,我正在编写一个访问远程服务器的例程。我连接到的这个服务器需要相互身份验证,所以我必须提供一个密钥库,在使用它的同时,我还希望建立一个适当的信任库 我可以找到大量关于如何使用keytool创建密钥库的教程,以及让Apache HTTP客户机识别密钥库的多种方法,但没有找到在Tomcat环境中存储密钥库以便应用程序能够找到密钥库的方法。不知何故,把它放在应用程序的war文件中对我来说似乎是个坏主意 同样,这不允许Tomcat处理入站https连接——我有一个由我们的管理团队为此设置的反向代理。我正在

我正在编写一个访问远程服务器的例程。我连接到的这个服务器需要相互身份验证,所以我必须提供一个密钥库,在使用它的同时,我还希望建立一个适当的信任库

我可以找到大量关于如何使用
keytool
创建密钥库的教程,以及让Apache HTTP客户机识别密钥库的多种方法,但没有找到在Tomcat环境中存储密钥库以便应用程序能够找到密钥库的方法。不知何故,把它放在应用程序的war文件中对我来说似乎是个坏主意

同样,这不允许Tomcat处理入站https连接——我有一个由我们的管理团队为此设置的反向代理。我正在创建需要相互身份验证的传出https连接,即接受自签名的目标服务器证书,并提供服务器的自签名客户端证书


在Tomcat环境中,您将实际的密钥存储库和信任存储库文件存储在何处,以供web应用程序使用?

您可以将密钥存储库放在任何地方,只要您知道如何告诉
httpclient
在何处加载密钥存储库

当然,这就是诀窍

在公认的答案中,隐藏在所有乱七八糟的代码中的是将
httpclient
与您自己的自定义密钥库一起使用的关键(哈!)。不幸的是,
httpclient
没有一个简单的API,比如“这是我的密钥库文件的路径,现在就使用它”或者“这是我的密钥库的字节,使用它们”(如果你想从类加载器或其他什么加载密钥库),但似乎就是这样

诚实的事实是,在Java中使用密钥库和信任库是一件混乱的事情,通常没有办法解决。我自己只使用HttpsURLConnection编写了一个应用程序,然后还添加了原始套接字组件,我知道这有多痛苦


上面链接的文章中的代码非常简单,如果有点冗长的话。不幸的是,您需要使生产质量代码更加混乱,因为您必须对流程的每一步进行错误检查等,以确保在您尝试设置各种商店并建立连接时,您的服务不会出现故障。

这基本上是对,但由于它涉及一些代码片段,请原谅我把它放在这里

不幸的是,httpclient没有像 “这是我的密钥库文件的路径,现在使用它”或“这是 如果要加载密钥库,请使用这些字节 从类加载器或任何东西),但似乎是这样的

这就是如何配置ApacheHttpClient 4.3以使用特定的信任存储进行SSL上下文初始化的方法

SSLContext sslContext = SSLContexts.custom()
        .loadTrustMaterial(trustStore)
        .build();
CloseableHttpClient client = HttpClients.custom()
        .setSslcontext(sslContext)
        .build();
可以从这样的资源加载信任材料

URL resource = getClass().getResource("/com/mycompany/mystuff/my.truststore");
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream inputStream = resource.openStream();
try {
    trustStore.load(inputStream, null /*usually not password protected*/);
} finally {
    inputStream.close();
}

您所说的“适当的信任库”到底是什么意思,Java提供的信任库还没有满足这一要求?这是离题的,但我连接到的服务提供了一个自签名证书,这是cacert默认不可接受的。我目前“全部接受”,但他们已经打开了mutual,现在我还必须提供我自己的客户机自签名,因此如果我必须为keystore添加管道,那么我也应该利用这个机会添加truststore支持。首先我需要知道这些该死的东西放在哪里据我所知,密钥库文件可以位于服务器有权读取的目录路径中的任何位置。在tomcat的server.xml中,您需要在属性keystrefile中指定连接器端口8443中的目录路径。@Amz用于客户端TLS证书的密钥库与tomcat的
配置无关。这不是Tomcat的配置问题。请看我的帖子,基本上是对你答案的评论+否则,我将为您的答案添加1。感谢更新的代码片段。如果
HttpClient
人员没有隐藏他们的Javadoc,我可能已经能够搜索任何现有的适用方法(或者,在本例中,是构建器)(