web-dev-qa-db-ja.com

Spring RestTemplateを使用してHTTPS RESTful Webサービスを呼び出す方法

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


        }
12
user1272936

キーストアに証明書を保持する必要があるか、すべての証明書を受け入れることができます(証明書の検証を無視することはできません)

したがって、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は必要ありません。

17
user1211