Springboot系列-配置Https

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就介紹到這

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