RestTemplate添加HTTPS證書全過程解析
RestTemplate添加HTTPS證書
證書的下載
先通過瀏覽器將未簽名驗證的證書保存到本地, 點擊 不安全–> 證書–> 詳細信息 --> 復(fù)制到文件 然后默認選擇 起一個文件名 , 保存即可, 比如我將證書保存在了桌面 , 命名為 xx.cer
證書導入JDK
若是想要在項目中用到證書 , 需要先將證書導入到JDK的證書管理里面, 導入命令如下:
keytool -import -noprompt -trustcacerts -alias xx -keystore /home/oracle/jdk1.8.0_181/jre/lib/security/cacerts -file xx.cer
對上面的命令做一個解釋 此命令是在linux服務(wù)器內(nèi)執(zhí)行的 , 在執(zhí)行這個命令的時候就在證書所在的文件夾下打開終端, 然后命名一下別名 , 別名最好和證書名稱一致 , 如上, 都叫xx , 另外將上面命令中的JDK路徑換成你的實際路徑即可
上面命令輸入完畢后回車 , 會讓你寫密碼啥的 , 就寫 changeit 若是changeit不行就寫 changeme 一般的 chageit 就可以了
生成keystore文件
只將證書導入JDK就可以了嗎? 我這里驗證的是不可以的, 必須還要生成對應(yīng)的 keystore文件
keystore文件生成命令: keytool -import -file xx.cer -keystore xx.keystore
對上面的命令做一個解釋 , 該命令也是在linux下執(zhí)行的 ,當然windows下也可以的 , 執(zhí)行的時候也是在證書所在文件夾進行的 , 若是提示權(quán)限不夠 那就再加sudo , windows就以管理員的身份執(zhí)行
回車后又會讓你輸入密碼 , 那么就還對應(yīng)著輸入 chageit 即可
執(zhí)行完畢后會在當前路徑下再產(chǎn)生一個xx.keystore文件
項目中配置
將上面上傳的xx.keystore 文件文件復(fù)制到你的項目的類路徑下
將下面的這個restTemplate的配置復(fù)制到你的項目中去,其中里面用到了一個httpConverter 這個是做json格式轉(zhuǎn)換的, 和HTTPS沒太大關(guān)系 , 若是不需要就將它以及相關(guān)代碼刪掉即可
package com.abc.air.config; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.ssl.SSLContextBuilder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.web.client.RestTemplate; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; /** * Created by ZhaoTengchao on 2019/4/12. */ @Configuration public class RestTemplateConfig { @Autowired private FastJsonHttpMessageConverter httpMessageConverter; @Bean RestTemplate restTemplate() throws Exception { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); factory.setConnectionRequestTimeout(5 * 60 * 1000); factory.setConnectTimeout(5 * 60 * 1000); factory.setReadTimeout(5 * 60 * 1000); // https SSLContextBuilder builder = new SSLContextBuilder(); KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); ClassPathResource resource = new ClassPathResource("nonghang.keystore"); InputStream inputStream = resource.getInputStream(); keyStore.load(inputStream, null); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(builder.build(), NoopHostnameVerifier.INSTANCE); Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", new PlainConnectionSocketFactory()) .register("https", socketFactory).build(); PoolingHttpClientConnectionManager phccm = new PoolingHttpClientConnectionManager(registry); phccm.setMaxTotal(200); CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(socketFactory).setConnectionManager(phccm).setConnectionManagerShared(true).build(); factory.setHttpClient(httpClient); RestTemplate restTemplate = new RestTemplate(factory); List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters(); ArrayList<HttpMessageConverter<?>> convertersValid = new ArrayList<>(); for (HttpMessageConverter<?> converter : converters) { if (converter instanceof MappingJackson2HttpMessageConverter || converter instanceof MappingJackson2XmlHttpMessageConverter) { continue; } convertersValid.add(converter); } convertersValid.add(httpMessageConverter); restTemplate.setMessageConverters(convertersValid); inputStream.close(); return restTemplate; } }
到此配置完畢!
RestTemplate訪問HTTPS
本文簡述一下怎么使用restTemplate來訪問https。
maven
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.3</version> </dependency>
這里使用httpclient的factory
配置
@Bean public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true; SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() .loadTrustMaterial(null, acceptingTrustStrategy) .build(); SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); CloseableHttpClient httpClient = HttpClients.custom() .setSSLSocketFactory(csf) .build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); requestFactory.setHttpClient(httpClient); RestTemplate restTemplate = new RestTemplate(requestFactory); return restTemplate; }
驗證
@Test public void testHttps(){ String url = "https://free-api.heweather.com/v5/forecast?city=CN101080101&key=5c043b56de9f4371b0c7f8bee8f5b75e"; String resp = restTemplate.getForObject(url, String.class); System.out.println(resp); }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
intellij idea如何配置網(wǎng)絡(luò)代理
intellij idea所在的這臺電腦本身上不了網(wǎng),要通過代理上網(wǎng),那么intellij idea怎么設(shè)置代理上網(wǎng)呢?今天通過本文給大家分享intellij idea如何配置網(wǎng)絡(luò)代理,感興趣的朋友一起看看吧2023-10-10基于Spring?Cache實現(xiàn)Caffeine+Redis二級緩存
本文主要介紹了基于Spring?Cache實現(xiàn)Caffeine+Redis二級緩存,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03SpringBoot中Filter?bean如何添加到Servlet容器
這篇文章主要介紹了SpringBoot中Filter bean是怎么被添加到Servlet容器中的,本文分步驟結(jié)合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08Spring Web項目spring配置文件隨服務(wù)器啟動時自動加載
這篇文章主要介紹了Spring Web項目spring配置文件隨服務(wù)器啟動時自動加載,加載spring的配置文件,并且只加載一次,從而提高程序效率。具體內(nèi)容詳情大家通過本文一起學習吧2018-01-01java使用RandomAccessFile類基于指針讀寫文件實例代碼
這篇文章主要介紹了java使用RandomAccessFile類基于指針讀寫文件實例代碼,具有一定參考價值,需要的朋友可以了解下。2017-10-10