一、HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 [1] 。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯。
二、生成密钥(JDK生成方式)
1、接收方(服务端)
keytool -genkey -alias server -keyalg RSA -keystore server.jks
2、接收方(服务端)导出证书
keytool -export -file server.cer -alias server -keystore server.jks
3、导出发送方密钥
keytool -import -keystore client.jks -file server.cer -alias client
4、最后有3个文件
三、springboot作为服务端配置
server: ssl: enabled: true key-alias: server key-store-type: jks key-store: classpath:jks/server.jks key-password: <password> key-store-password: <password>
四、RestTemplate作为客户端配置
1、需要在springboot的基础上加入httpclient依赖
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency>
2、加入配置
import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContextBuilder; 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.web.client.RestTemplate; import javax.net.ssl.SSLContext; @Configuration public class RestConfiguration { @Bean public RestTemplate restTemplate() throws Exception { HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); //超时配置 factory.setReadTimeout(5000); factory.setConnectTimeout(2000); //https SSLContext sslContext = SSLContextBuilder.create() .loadTrustMaterial(new ClassPathResource("jks/client.jks").getFile(), "<password>".toCharArray()) .build(); //连接facotry SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE); factory.setHttpClient(HttpClients.custom().setSSLSocketFactory(socketFactory).build()); return new RestTemplate(factory); } }
五、总结https不是难在配置,也是难在加密方式。目前国内很多都有考虑采用国标加密算法,而不是RSA的方式,所以这里需要自行考虑。