2

SpringアプリケーションでRESTサービスを使用したいと考えています。そのサービスにアクセスするために、私は認可のためのクライアント証明書(自己署名入り.jks形式)を持っています。 残りのサービスに対して認証する適切な方法は何ですか?春にresttemplateがリクエストするたびにクライアント証明書を送信する正しい方法は何ですか?

これが私の要求です:今

@Bean 
public RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception { 
    char[] password = "password".toCharArray(); 

    SSLContext sslContext = SSLContextBuilder.create() 
      .loadKeyMaterial(keyStore("classpath:cert.jks", password), password) 
      .loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(); 

    HttpClient client = HttpClients.custom().setSSLContext(sslContext).build(); 
    return builder 
      .requestFactory(new HttpComponentsClientHttpRequestFactory(client)) 
      .build(); 
} 

private KeyStore keyStore(String file, char[] password) throws Exception { 
    KeyStore keyStore = KeyStore.getInstance("PKCS12"); 
    File key = ResourceUtils.getFile(file); 
    try (InputStream in = new FileInputStream(key)) { 
     keyStore.load(in, password); 
    } 
    return keyStore; 
} 

:ここ

public List<Info> getInfo() throws RestClientException, URISyntaxException { 

    HttpEntity<?> httpEntity = new HttpEntity<>(null, new HttpHeaders()); 

    ResponseEntity<Info[]> resp = restOperations.exchange(
      new URI(BASE_URL + "/Info"), HttpMethod.GET, 
      httpEntity, Info[].class); 
    return Arrays.asList(resp.getBody()); 
} 

答えて

4

は、設定したSSLコンテキストを使用して独自のRestTemplateを定義する必要がありRestTemplateApache HttpClient

を使用してこれを行う方法の例でありますこのテンプレートによって実行されたすべてのリモート呼び出しはcert.jksで署名されます。 :あなたは

@Autowired 
private RestTemplate restTemplate; 

public List<Info> getInfo() throws RestClientException, URISyntaxException { 
    HttpEntity<?> httpEntity = new HttpEntity<>(null, new HttpHeaders()); 

    ResponseEntity<Info[]> resp = restTemplate.exchange(
      new URI(BASE_URL + "/Info"), HttpMethod.GET, 
      httpEntity, Info[].class); 
    return Arrays.asList(resp.getBody()); 
} 
+0

大きな感謝を作品あなたのクラスパスにcert.jksを置く必要があるだろう! – Nas3nmann

関連する問題