Spring RestTemplate 证书 403 禁止:[否 body]

Spring RestTemplate certificate 403 Forbidden: [no body]

我使用带有 RestTemplate 的 p12 证书来调用外部 API。

休息模板:

final SSLContext sslContext = new SSLContextBuilder()
                    .loadTrustMaterial(keyStoreFile.getURL(), keyPassword.toCharArray(), (X509Certificate[] chain, String authType) -> true)
                    .build();
            final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, INSTANCE);

            final HttpClient httpClient = custom()
                    .setSSLSocketFactory(socketFactory)
                    .setMaxConnTotal(1000)
                    .setMaxConnPerRoute(40)
                    .build();

            final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);

            restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(requestFactory));

然后调用:

HttpEntity<String> entity = new HttpEntity<>(httpHeaders);
final ResponseEntity<MyList> response = restTemplate.exchange("https://REMOTE_URI/sameObjects", GET, entity, MyList.class);

我尝试 header 使用不同的值 (User-Agent, Host, ..) 和 ResponseEntity<Object> ,但我总是有同样的错误:

org.springframework.web.client.HttpClientErrorException$Forbidden: 403 Forbidden: [no body]

我可以使用 p12 证书通过 Postman 访问它。

感谢您的帮助

我找到了解决方案,我更改了 RestTemplate :

  public RestTemplate getRestTemplate() {

        try {
            final KeyStore keyStore = KeyStore.getInstance(keyStoreType);
            keyStore.load(keyStoreFile.getInputStream(), keyPassword.toCharArray());


            final SSLContext sslContext = new SSLContextBuilder()
                    .loadTrustMaterial(keyStoreFile.getURL(), keyPassword.toCharArray(), (X509Certificate[] chain, String authType) -> true)
                    .loadKeyMaterial(keyStore, keyPassword.toCharArray())
                    .build();
            final SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, INSTANCE);

            final HttpClient httpClient = custom()
                    .setSSLSocketFactory(socketFactory)
                    .build();

            final HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);

            final RestTemplate restTemplate = new RestTemplate();
            restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(requestFactory));

            return restTemplate;
        } catch (IOException e) {
            log.error("....", e);
            throw new ApiException(e);
        } catch (Exception e) {
            log.error("....", e);
            throw new ApiException(e);
        }
    }