【问题标题】:How to make a call to server using client private key and certificate provided by the server in spring boot?如何在spring boot中使用服务器提供的客户端私钥和证书调用服务器?
【发布时间】:2020-04-19 08:31:38
【问题描述】:

我是 java 中的 ssl 新手,需要帮助。 我的应用程序需要使用他们提供的证书和我的公钥调用支付提供商服务器。

我做过的事情: 1.使用openssl创建私钥和公钥并将公钥提供给服务提供商(服务器) 2. 从服务器收到证书文件(crt) 3.使用keytool创建一个jks文件 4.将证书文件添加到信任库 5. 将 keystore 文件导入我的 spring boot 应用程序。

我的代码:

final String password = "password";
    SSLContext sslContext = SSLContextBuilder
            .create()
            .loadTrustMaterial(ResourceUtils.getFile("/home/workspace/gop/javaclient.jks"), password.toCharArray())
            .build();

    CloseableHttpClient client = HttpClients.custom()
            .setSSLContext(sslContext)
            .build();

    HttpComponentsClientHttpRequestFactory requestFactory
            = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(client);

    RestTemplate restTemplate = new RestTemplate(requestFactory);

    String url = "https://someurl.com/rndpoint"; // Web Service endpoint that requires SSL

    ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, HttpEntity.EMPTY, String.class);
    ResponseEntity<String> response2 = restTemplate.exchange(url, HttpMethod.GET, HttpEntity.EMPTY, String.class);

    System.out.println("Result = " + response.getBody());
    return response.getBody() + response2.getBody();

我已经仔细检查了,我肯定已经将证书导入到 cacerts。

我的输出:

{
    "timestamp": "2020-04-19T08:28:18.871+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "I/O error on POST request for \"https://nabiltest.compassplus.com:8444/Exec\": 
sun.security.validator.ValidatorException: PKIX path building failed: 
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: 
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to 
requested target",
    "path": "/nabil-payment"
}

【问题讨论】:

    标签: java spring spring-boot ssl


    【解决方案1】:

    我终于设法解决了这个问题。这是我的代码 sn-p。

    private RestTemplate getRestTemplateClientAuthentication()
     throws IOException, UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException,
     KeyStoreException, KeyManagementException {
    final String allPassword = "123456";
     TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
     SSLContext sslContext = SSLContextBuilder
     .create()
    //if you use keystore
     .loadKeyMaterial(ResourceUtils.getFile("classpath:keystore.jks"),
     allPassword.toCharArray(), allPassword.toCharArray())
    //if you want to use truststore instead
    //.loadTrustMaterial(ResourceUtils.getFile("classpath:truststore.jks"), allPassword.toCharArray())
     .loadTrustMaterial(null, acceptingTrustStrategy)
     .build();
    HttpClient client = HttpClients.custom()
     .setSSLContext(sslContext)
     .build();
    HttpComponentsClientHttpRequestFactory requestFactory =
     new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(client);
    RestTemplate restTemplate = new RestTemplate(requestFactory);
    return restTemplate;
    }
    

    现在只需使用此函数调用您的端点

    // url ->  endpoint url
    getRestTemplateClientAuthentication().exchange(url, HttpMethod.POST, HttpEntity.EMPTY, String.class);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-30
      • 2014-06-01
      • 2021-10-03
      相关资源
      最近更新 更多