将 .p12 文件用于 SSL - 使用 Spring Boot

Kal*_*ghe 3 java ssl jks pkcs#12 spring-boot

我想连接到安全的服务器端点。服务提供商为我提供了一个 .p12 文件和密码。在设置-> 证书--> 客户端证书下添加证书后,我尝试了对邮递员的 API 调用,结果成功。

现在我想将它集成到我的 Java 代码中。我正在使用 Spring Boot 开发此应用程序,并且为此遵循了一些指南。我使用此命令将 .p12 文件添加到我的密钥库中。

keytool -importkeystore -srckeystore uat_client.p12 -destkeystore store.keys -srcstoretype pkcs12 -alias myownkeyname 
Run Code Online (Sandbox Code Playgroud)

但是每次我收到“未提供 SSL 客户端证书”时,这与我没有在邮递员中添加证书时得到的响应相同。

我知道这不是寻求帮助的理想方式,因为我没有太多代码要展示。而且我对 Java 的这个领域很陌生。我只是要求一些指导。如果我有一个 .p12 文件,我需要遵循哪些步骤才能成功连接到服务。

public void someMethod()
{
    RestTemplate restTemplate = new RestTemplate();
    HttpHeaders httpHeaders = new HttpHeaders();

    String uri = "https://xx.net/api/v2/somemethod";

    httpHeaders.setContentType(MediaType.APPLICATION_JSON);

    String result = restTemplate.getForObject(uri, String.class);

    System.out.println("Result " + result);
}
Run Code Online (Sandbox Code Playgroud)

Fat*_*tih 5

To configure Spring RestTemplate to use a client certification in a HTTPS connection, use following steps:

@Bean
public RestTemplate restTemplate() {
    KeyStore clientStore = KeyStore.getInstance("PKCS12");
    clientStore.load(new FileInputStream("certfile-path"), "certificate-password".toCharArray());

    SSLContextBuilder sslContextBuilder = new SSLContextBuilder();
    sslContextBuilder.useProtocol("TLS");
    sslContextBuilder.loadKeyMaterial(clientStore, "certificate-password".toCharArray());
    sslContextBuilder.loadTrustMaterial(new TrustSelfSignedStrategy());

    SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContextBuilder.build());
    CloseableHttpClient httpClient = HttpClients.custom()
            .setSSLSocketFactory(sslConnectionSocketFactory)
            .build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
    return new RestTemplate(requestFactory);
}
Run Code Online (Sandbox Code Playgroud)

and Inject restTemplate for using:

@Autowired
RestTemplate restTemplate;

public void someMethod() {
    HttpHeaders httpHeaders = new HttpHeaders();
    String uri = "https://xx.net/api/v2/somemethod";
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    String result = restTemplate.getForObject(uri, String.class);
    System.out.println("Result " + result);
}
Run Code Online (Sandbox Code Playgroud)

That's it. Hope it is solved.