前言
本文主要介紹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數字證書
- 創建自簽證書
- 從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的