import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.cert.CertificateException;
@Configuration
public class CustomRestTemplateConfig {
@Value("${params.pfxKey}")
private String pfxKey;
@Bean
public RestTemplate customRestTemplate(RestTemplateBuilder restTemplateBuilder) {
// 加载PFX文件到密钥存储
KeyStore keyStore;
try {
keyStore = KeyStore.getInstance("PKCS12");
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("certificate/testISSUE.pfx");
keyStore.load(inputStream, pfxKey.toCharArray());
} catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException e) {
throw new RuntimeException("Failed to load PFX file into KeyStore.", e);
}
// 创建SSL上下文并初始化
SSLContext sslContext;
try {
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, pfxKey.toCharArray());
sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagerFactory.getKeyManagers(), null, null);
} catch (NoSuchAlgorithmException | KeyStoreException | UnrecoverableKeyException | KeyManagementException e) {
throw new RuntimeException("Failed to initialize SSLContext.", e);
}
// 创建自定义的RestTemplate实例
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLContext(sslContext)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
RestTemplate restTemplate = restTemplateBuilder.requestFactory(() -> requestFactory).build();
// 设置字符编码为UTF-8
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
stringConverter.setWriteAcceptCharset(false);
restTemplate.getMessageConverters().removeIf(converter -> converter instanceof StringHttpMessageConverter);
restTemplate.getMessageConverters().add(0, stringConverter);
return restTemplate;
}
}