Springboot系列-配置Https
前言:關於HTTP和HTTPS相信大家多少都對其有些瞭解,而且隨着對安全方面的着重,HTTPS普及的也越來越廣泛,本片博客將針對於Springboot如何配置HTTPS進行介紹
1.HTTP與HTTPS
在介紹關於Springboot配置HTTPS之前,先來簡單聊一下關於什麼是HTTP和HTTPS,有什麼作用,他們之間有什麼區別
我們通常使用瀏覽器去訪問一個頁面,在瀏覽器地址欄中我們會看到一串URL,比如: http://www.wxy.com ; 其實這個網站的url分爲兩部分
- http/https:這部分我們通常稱爲通信協議,簡單來說就是瀏覽器與服務器之間溝通的語言
- www.wxy.com:這部分我們通常稱爲域名,就是我們訪問的一個地址
HTTP
HTTP中文名稱:超文本傳輸協議,它是一種使用明文數據傳輸的網絡協議,所以HTTP協議的明文傳輸在某些方面存在很大的安全隱患,比如網上買東西,在你輸入支付密碼的時候由於明文數據傳輸,所以很容易被截取
HTTPS
HTTPS中文名稱:超文本傳輸安全協議,所謂HTTPS就是是在HTTP協議基礎上加入加密處理和認證機制以及完整性保護,即HTTP+加密+認證+完整性保護=HTTPS。但是HTTPS並非應用層的一種新協議,只是HTTP通信接口部分用SSL /TLS協議代替而已。通常HTTP直接和TCP通信,當使用SSL 時則演變成先和SSL 通信,再由SSL 和TCP通信。
簡單說HTTPS,其實就是身披SSL 協議這層外殼的HTTP,SSL 是“Secure Sockets Layer”的縮寫,中文叫做“安全套接層”,採用數據加密傳輸,是HTTP和HTTPS之間的本質性區別,SSL具體協議基本原理,可自行查閱
2.配置準備
按照正常情況下我們是需要有一個HTTPS證書,因爲證書是需要花費或者去雲廠商申請,所以爲了方便我們直接使用Java自帶的JDK管理工具keytool來生成一個免費的的HTTPS證書
進入到 %JAVA_HOME%\bin 目錄下,執行如下一條命令:
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:\wxy.p12 -validity 365
對於以上命令是什麼意思呢,簡單介紹如下:
- genkey :表示創建一個新的密鑰
- alias :表示 keystore 的別名
- keyalg :表示使用的加密算法是 RSA ,一種非對稱加密算法
- keysize :表示密鑰長度
- keystore :表示生成的密鑰存放位置
- validity :表示密鑰的有效時間,單位爲天
如下爲博主的獲取截圖:
執行完成之後根據你自己設置的相應路徑找到相應的文件,如我的爲D:/
3.引入HTTPS
1.配置完成之後我們需要將剛纔生成的wxy.p12文件引入到我們的Springboot項目中,將生成文件放置到resource目錄下面
2.配置文件application.properties中添加如下配置
server.ssl.key-store=classpath:wxy.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=XXXXXX
- key-store表示密鑰文件名
- key-alias表示密鑰別名
- key-store-password就是在cmd命令執行過程中輸入的密碼。
3.我們簡單的在controller層裏面寫個訪問資源
@RestController
public class DemoController {
@GetMapping("/start")
public String start(){
return "hello world";
}
4.配置完成後,啓動 Spring Boot 項目,此時直接使用 Http 協議來訪問接口,就會看到如下錯誤
使用 Https 協議來訪問接口
出現上述的問題因爲我們自己生成的 https 證書不被瀏覽器認可
4.請求轉發
考慮到 Spring Boot 不支持同時啓動 HTTP 和 HTTPS ,爲了解決這個問題,可以選擇配置一個請求轉發,當用戶發起 HTTP 調用時,自動轉發到 HTTPS 上
配置如下:
@Configuration
public class TomcatConfig {
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
factory.addAdditionalTomcatConnectors(createTomcatConnector());
return factory;
}
private Connector createTomcatConnector() {
Connector connector = new
Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8081);
connector.setSecure(false);
connector.setRedirectPort(8080);
return connector;
}
}
如上述代碼配置了 Http 的請求端口爲 8081,所以所有來自 8081 的請求,將被自動重定向到 8080 這個 https 的端口上。之後,我們再去訪問 http 請求,就會自動重定向到 https上了
結語:如上配置,說明無論是在各大網站還是支付環境下都是相對來說安全的,即使我們訪問的環境不安全,也會自動重定向到安全環境,對此針對於在Springboot項目中如何配置HTTPS就介紹到這