【问题标题】:Using .p12 file for SSL - Using Spring Boot使用 .p12 文件进行 SSL - 使用 Spring Boot
【发布时间】:2020-06-21 23:56:42
【问题描述】:

我想连接到安全的服务器端点。服务提供商为我提供了一个 .p12 文件和密码。在settings -->certificates-->client certificate下添加证书后,我尝试了对postman的API调用,并且成功了。

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

keytool -importkeystore -srckeystore uat_client.p12 -destkeystore store.keys -srcstoretype pkcs12 -alias myownkeyname 

但是每次我得到“没有提供 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);
}

【问题讨论】:

    标签: java spring-boot ssl pkcs#12 jks


    【解决方案1】:

    要将 Spring RestTemplate 配置为在 HTTPS 连接中使用客户端认证,请使用以下步骤:

    @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);
    }
    

    并注入 restTemplate 以供使用:

    @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);
    }
    

    就是这样。希望能解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-01
      • 2017-07-25
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2020-02-22
      • 2017-09-10
      • 2016-07-01
      相关资源
      最近更新 更多