2017-08-04 12 views
2

証明書を必要とするサービスにhttps投稿リクエストを作成しようとしています。私はSOAPUIとPostmanで同じリクエストを受け取りました。私はrestTemplateを使ってSpringブートで動作する他の、証明書以外のPOSTリクエストを取得することもできました。しかし、私はrestTemplateと証明書のPOSTリクエストを作ってみると、私は次の例外受け取る取得:以下Spring Boot restTemplate POSTリクエストbad_certificate、SOAPUIとPostmanで動作します

http-nio-8080-exec-5, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate 
2017-08-04 10:13:23.953 ERROR 54082 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on POST request for "htpps://...": Received fatal alert: bad_certificate; nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate] with root cause 

javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate 

をSOAPUIが働く。:

POST https://... HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: application/json 
Content-Length: 0 
Host: ... 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 

をここで作る生の要求は、関連する春ブーツです

// request info 
logger.info("enter"); 
String endpoint = "https://..."; 
String certFileName = "src/main/resources/keystore.jks"; 
String pass = "tempPass"; 
String body = "{}"; 

// set up cert 
logger.info("begin load cert"); 
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
keyStore.load(new FileInputStream(new File(certFileName)), pass.toCharArray()); 
SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy()).loadKeyMaterial(keyStore, pass.toCharArray()).build()); 
HttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).build(); 
ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient); 

// set up request 
logger.info("setup request"); 
RestTemplate restTemplate = new RestTemplate(requestFactory); 
HttpHeaders headers = new HttpHeaders(); 
headers.setContentType(MediaType.APPLICATION_JSON); 
HttpEntity<String> entity = new HttpEntity<>(body); 

// make request 
logger.info("make request"); 
ResponseEntity<Object> res = restTemplate.postForEntity(endpoint, entity, Object.class); 
// ResponseEntity<Object> res = restTemplate.exchange(endpoint, HttpMethod.POST, entity, Object.class); 

// handle output 
logger.info("received output"); 
if (res.getStatusCode().is2xxSuccessful()) 
    return res.getBody().toString(); 
else 
    return res.getStatusCode().toString(); 

さらなる詳細は動作しないコード、:、 私はこの問題かどうかわからないんだけど、私はまた-Dtrust_all_cert=trueフラグを試してみました同じ結果です。また、-Djavax.net.debug=allフラグを試しましたが、すべての出力が成功したようです。デバッグを含めることができれば役立つかもしれませんが、長いです。私はこの証明書に特有の他の構成設定はありません - POST要求。

私はJava 1.8を使用しています。

私は、私のコードの証明書の一部を追加する必要があり、私はケースの他の誰の出会いでSpring Boot restTemplate POST request bad_certificate, but works in SOAPUI and Postman

答えて

1

の答えから、このような状況をコピーし、

原因は、私が使用したキーストアが含まれていることになってしまいました複数の証明書。 SoapUIとPostmanはこれに問題はありませんでしたが、restTemplate(私が信じるapache)はキーストア内の最初の証明書の使用だけを試みます。 Javaキーストアツールを使用してキーストアから無関係な証明書を削除すると、問題が解決されました。

関連する問題