私は私の春のアプリケーションでRESTサービスを消費したい。そのサービスにアクセスするには、承認のためにクライアント証明書(自己署名および.jks形式)があります。残りのサービス?
これは私のリクエストです:
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());
}
RestTemplate および Apache HttpClient を使用してこれを行う方法の例を次に示します
設定されたSSLコンテキストで独自の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;
}
これで、このテンプレートによって実行されるすべてのリモート呼び出しは、cert.jks
で署名されます。 注: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());
}
または、証明書をJDK cacertsにインポートするだけで、jdkを使用するすべてのHTTPクライアント(この場合は残りのテンプレート)は証明書を使用してREST呼び出しを行います。
keytool -import -keystore $Java_HOME/jre/lib/security/cacerts -file foo.cer -alias alias
追伸:インポートが成功したら、サーバーを再起動することを忘れないでください。キーストアのデフォルトのパスワード-changeit