我需要将这 3 个 pem 文件(
ca.pem
、key.pem
和 cert.pem
)添加到我的 http 客户端,以便访问客户端的服务。
如何让这些与我现有的 httpclient 一起工作? 任何帮助将不胜感激。
谢谢。
File caFile = new File(getClass().getResource("/certs/ca.pem").getPath());
File keyFile = new File(getClass().getResource("/certs/key.pem").getPath());
File certFile = new File(getClass().getResource("/certs/cert.pem").getPath());
SSLContext sslContext = new SSLContextBuilder()
.loadTrustMaterial(null, ( certificate, authType ) -> true).build();
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLContext(sslContext)
.setSSLHostnameVerifier(new NoopHostnameVerifier())
.addInterceptorFirst((HttpRequestInterceptor) ( httpRequest, httpContext ) -> {
httpRequest.setHeader("Content-Type", "application/xml");
})
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
我已经指导了 OP 并在他的问题的评论部分提供了答案。该解决方案确实有效,所以我将其发布在这里。
Java 在处理所有不同的 pem 文件方面是有限且冗长的。在过去,我还想为不同的项目加载 pem 文件并使其可重用,我创建了一个库来解决这个问题。我为 apache http 客户端提供给 OP 的解决方案是:
选项 1
您首先需要添加以下依赖GitHub - SSLContext Kickstart:
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart-for-pem</artifactId>
<version>7.4.11</version>
</dependency>
然后您可以使用以下代码片段:
import nl.altindag.ssl.SSLFactory;
import nl.altindag.ssl.util.PemUtils;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import javax.net.ssl.X509ExtendedKeyManager;
import javax.net.ssl.X509ExtendedTrustManager;
public class App {
public static void main(String[] args) {
X509ExtendedKeyManager keyManager = PemUtils.loadIdentityMaterial("certs/cert.pem", "certs/key.pem");
X509ExtendedTrustManager trustManager = PemUtils.loadTrustMaterial("certs/ca.pem");
SSLFactory sslFactory = SSLFactory.builder()
.withIdentityMaterial(keyManager)
.withTrustMaterial(trustManager)
.build();
HttpClient httpclient = HttpClients.custom()
.setSSLContext(sslFactory.getSslContext())
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpclient);
}
}
选项2
如果你不想要上面的库并且你没有加密的私钥并且只有证书作为 pem 文件,那么你也可以尝试从另一个答案中给出以下示例:https://stackoverflow.com/ a/42733858/6777695 这提供了一个简单的 java 示例如何解析 pem 文件。如果你有一个加密的私钥,它会变得有点冗长,更多信息请参见这里:以编程方式解析加密的 PKCS#8 编码的 pem 文件