将 .pem 文件添加到 Apache HttpClient

问题描述 投票:0回答:1

我需要将这 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);
java spring-boot ssl apache-httpclient-4.x
1个回答
1
投票

我已经指导了 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 文件

© www.soinside.com 2019 - 2024. All rights reserved.