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,我可能已经能够搜索任何现有的适用方法(或者,在本例中,是构建器)(