1. 程式人生 > >Spring Boot SSL [https]配置例子

Spring Boot SSL [https]配置例子

web rec 協議 actor sets err word size ESS

前言

本文主要介紹Spring Boot HTTPS相關配置,基於自簽證書實現;

通過本例子,同樣可以了解創建SSL數字證書的過程;

本文概述

Spring boot HTTPS 配置

server.port=8443
server.ssl.key-alias=selfsigned_localhost_sslserver
server.ssl.key-password=changeit
server.ssl.key-store=classpath:ssl-server.jks
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS

Http請求自動跳轉到Https

private Connector redirectConnector() {
  Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
  connector.setScheme("http");
  connector.setPort(8080);
  connector.setSecure(false);
  connector.setRedirectPort(8443);
  return connector;
}

更多詳細配置,請繼續閱讀

相關術語

在繼續學習之前,先了解下相關術語:

SSL:SSL(Secure Sockets Layer 安全套接層),用以保障在Internet上數據傳輸之安全,利用數據加密(Encryption)技術,可確保數據在網絡上之傳輸過程中不會被截取及竊聽。

TLS:安全傳輸層協議(TLS)用於在兩個通信應用程序之間提供保密性和數據完整性。該協議由兩層組成: TLS 記錄協議(TLS Record)和 TLS 握手協議(TLS Handshake)。

HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

truststore
Truststore and Keystore:主要用於Java中存儲證書,它們之間的區別是truststore用於存儲public證書,而keystore用於存儲private證書

創建自簽證書

可以通過以下兩種方式獲取SSL數字證書

  1. 創建自簽證書
  2. 從CA機構獲取

出於方便本例子將使用自簽證書,通過java keytool命令生成,如下示例:

keytool -genkey -alias selfsigned_localhost_sslserver -keyalg RSA -keysize 2048 -validity 700 -keypass changeit -storepass changeit -keystore ssl-server.jks

簡單解釋下以上命令的含義:
-genkey – keytool命令,用於生成證書,事實上keytool是一個多用途和健壯的工具,支持豐富的命令參數;
-alias selfsigned_localhost_sslserver 聲明證書的別名,SSL/TLS層使用;
-keyalg RSA -keysize 2048 -validity 700 –設置加密算法、秘鑰大小、validity參數.
-keypass changeit -storepass changeit– truststore 和 keystore的密碼;
-keystore ssl-server.jks – 存儲證書、公鑰私鑰的文件,使用JKS格式 – Java Key Store,除了JKS外,還有其它格式可選擇;

一旦我們執行以上命令,會要求我們輸入證書相關信息,最終效果如下:
技術分享圖片

最終生成的證書在我們執行keytool命令的目錄下,如果要查看證書內部是什麽,可以使用keytool -list命令:

keytool -list -keystore ssl-server.jks

創建Spring Boot工程配置SSL

生成Spring Boot工程

生成Spring Boot最簡便的方式是通過SPRING INITIALIZR網站來創建,我們選擇Web和Rest依賴,並輸入Maven GAV 坐標,然後選擇下載,下載骨架工程,解壓並導入到我們的IDE中即可;
技術分享圖片

添加RestController

出於測試考慮,我們將創建一個非常簡單的RestController,代碼如下:

@RestController
class SecuredServerController{
    
    @RequestMapping("/secured")
    public String secured(){
        System.out.println("Inside secured()");
        return "Hello user !!! : " + new Date();
    }
}

Spring boot SSL配置

首先我們需要拷貝ssl-server.jks文件到我們的resources 目錄下,然後打開application.properties文件,添加如下配置:

server.port=8443
server.ssl.key-alias=selfsigned_localhost_sslserver
server.ssl.key-password=changeit
server.ssl.key-store=classpath:ssl-server.jks
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS

配置完成,就這麽簡單,是不是很方便;

Demo演示

完成以上步驟後:
我們就可以通過mvn clean install命令構建工程,
通過java -jar target\ssl-server-0.0.1-SNAPSHOT.jar命令啟動應用,端口為8443 ,
最後通過 https://localhost:8443/secured URL訪問我們的資源;

由於我們的REST服務是GET方法,我們可以通過瀏覽器進行測試,訪問https://localhost:8443/secured URL即可;
由於我們的證書不是受信任的頒發機構頒發的,所以我們需要添加例外,之後就可以訪問了,如下圖所示:
技術分享圖片

HTTP 請求跳轉到HTTPS

這是一個可選的步驟,有時候我們希望全站都是安全的,就需要所有http請求都能自動跳轉到https;

假設我們的HTTP端口是8080,HTTPS端口是8443,希望所有的8080端口請求都能自動跳轉到8443 ,實現該功能只需要作如下配置即可:

@Bean
public EmbeddedServletContainerFactory servletContainer() {
  TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() {
      @Override
      protected void postProcessContext(Context context) {
        SecurityConstraint securityConstraint = new SecurityConstraint();
        securityConstraint.setUserConstraint("CONFIDENTIAL");
        SecurityCollection collection = new SecurityCollection();
        collection.addPattern("/*");
        securityConstraint.addCollection(collection);
        context.addConstraint(securityConstraint);
      }
    };
  
  tomcat.addAdditionalTomcatConnectors(redirectConnector());
  return tomcat;
}

private Connector redirectConnector() {
  Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
  connector.setScheme("http");
  connector.setPort(8080);
  connector.setSecure(false);
  connector.setRedirectPort(8443);
  
  return connector;
}

最後,做個測試,訪問HTTP接口 http://localhost:8080/secured ,瀏覽器上觀察是否自動跳轉到HTTPS URL了,不出意外,應該是OK的

原文文鏈

Site4J

Spring Boot SSL [https]配置例子