https在springboot和RestTemplate中的使用

  一、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的方式,所以这里需要自行考虑。

 

        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章