ReST Webサービス用のSpringフレームワークであるTomcat7を使用しています。 httpsWebサービスをSpring RestTemplateを使用して呼び出そうとしています。次のエラーが表示されます。
要求されたターゲットへの有効な認証パスが見つかりません。ネストされた例外はjavax.net.ssl.SSLHandshakeExceptionです:Sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:Sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な認証パスが見つかりません
私はstackoverflowでオンラインで確認します。 URLからサンプルコードを試しました: Spring RestTemplateを使用してHttps Rest Serviceにアクセス
私はそれを動作させることができませんでした。以下のコードに基づいて、何を変更する必要がありますか?また、誰かが私に教えたり、Javaライブラリが必要ですか?pom.xmlファイルを提供できますか?
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.journaldev.spring.controller.EmpRestURIConstants;
import com.journaldev.spring.model.CostControlPost;
import com.journaldev.spring.model.Employee;
import com.journaldev.spring.model.RfxForUpdate;
import static org.junit.Assert.*;
import org.Apache.commons.codec.binary.Base64;
import javax.net.ssl.*;
import Java.io.*;
import Java.security.KeyStore;
import Java.security.MessageDigest;
import Java.security.cert.CertificateException;
import Java.security.cert.X509Certificate;
public class TestExample2
{
public static final String SERVER_LIST="https://abc/sourcing/testServices";
@Test
public void testGetListOfServiceNames()
{
try
{
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.exchange(SERVER_LIST,HttpMethod.GET,null,String.class);
assertNotNull(response);
}
catch(Exception e)
{
System.out.println("e:"+e.getMessage());
}
}
}
キーストアに証明書を保持する必要があるか、すべての証明書を受け入れることができます(証明書の検証を無視することはできません)
したがって、restテンプレートのBeanを次のように再定義できます。
import javax.net.ssl.SSLContext;
import org.Apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.Apache.http.conn.ssl.TrustStrategy;
import Java.security.cert.X509Certificate;
@Bean
public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = org.Apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(csf)
.build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
return restTemplate;
}
Apacheコア、クライアント、および依存関係を除いて、追加のjarは必要ありません。