web-dev-qa-db-ja.com

春にresttemplateによって行われたすべてのリクエストでクライアント証明書を送信する正しい方法は何ですか?

私は私の春のアプリケーションで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());
}
9
Nas3nmann

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

または、証明書をJDK cacertsにインポートするだけで、jdkを使用するすべてのHTTPクライアント(この場合は残りのテンプレート)は証明書を使用してREST呼び出しを行います。

keytool -import -keystore $Java_HOME/jre/lib/security/cacerts -file foo.cer -alias alias

追伸:インポートが成功したら、サーバーを再起動することを忘れないでください。キーストアのデフォルトのパスワード-changeit

2
Abhijeet