Spring BootのRestTemplateのHttpURLConnectionをSSL通信にカスタマイズする方法
RestTemplateで標準で使用されているSimpleClientHttpRequestFactoryクラスですが、このクラスのHttpURLConnectionをカスタマイズしてhttpsのRest APIを実行できるようにします。
RestTemplateでSSL通信したい場合にこの実装をしました。pfxファイルはS3に配置している前提です。
RestClientConfig.java
package jp.co.confrage.config; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.security.KeyManagementException; | |
import java.security.KeyStore; | |
import java.security.KeyStoreException; | |
import java.security.NoSuchAlgorithmException; | |
import java.security.UnrecoverableKeyException; | |
import java.security.cert.CertificateException; | |
import javax.net.ssl.HttpsURLConnection; | |
import javax.net.ssl.KeyManagerFactory; | |
import javax.net.ssl.SSLContext; | |
import org.springframework.context.annotation.Bean; | |
import org.springframework.stereotype.Component; | |
import org.springframework.web.client.RestTemplate; | |
import com.amazonaws.services.s3.AmazonS3; | |
import com.amazonaws.services.s3.model.GetObjectRequest; | |
import com.amazonaws.services.s3.model.S3Object; | |
import lombok.RequiredArgsConstructor; | |
@RequiredArgsConstructor | |
@Component | |
public class RestClientConfig { | |
private final AmazonS3 s3; | |
private final S3Config s3Config; | |
@Bean | |
public RestTemplate restTemplate() throws Exception { | |
KeyManagerFactory keyManagerFactory; | |
try (InputStream inputStream = getS3Pfx()) { | |
KeyStore keyStore = KeyStore.getInstance("PKCS12"); | |
String password = "password"; | |
keyStore.load(inputStream, password.toCharArray()); | |
keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); | |
keyManagerFactory.init(keyStore, password.toCharArray()); | |
SSLContext sslContext = SSLContext.getInstance("TLS"); | |
sslContext.init(keyManagerFactory.getKeyManagers(), null, null); | |
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); | |
} catch (KeyStoreException | |
| NoSuchAlgorithmException | |
| CertificateException | |
| IOException | |
| UnrecoverableKeyException | |
| KeyManagementException e) { | |
e.printStackTrace(); | |
} | |
return new RestTemplate(); | |
} | |
private InputStream getS3Pfx() throws Exception { | |
String bucket = s3Config.getBucket(); | |
String key = s3Config.getObjectKey(); | |
S3Object object = s3.getObject(new GetObjectRequest(bucket, key)); | |
return object.getObjectContent(); | |
} | |
} |
SimpleClientHttpRequestFactoryクラスを継承したクラスを作成してRestTemplateに設定する必要があると思ったのですが、HttpsURLConnection.setDefaultSSLSocketFactoryメソッドがstaticメソッドなので、このBean登録しておくだけでHTTPS通信が可能なRestTemplateクラスになります。
「Spring BootでRestTemplateのClientHttpRequestFactory実装クラスをHttpComponentsClientHttpRequestFactoryに変更する 」
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^