spring boot支持https請求配置

整體介紹

本文是在SpringBoot中配置Https請求,SpringBoot默認是不支持同時啓動HTTP和HTTPS請求。實現HTTPS是根據請求轉發方式。

https 現在已經越來越普及了,特別是做一些小程序或者公衆號開發的時候,https 基本上都是剛需了。不過一個 https 證書還是挺費錢的,個人開發者可以在各個雲服務提供商那裏申請一個免費的證書。我印象中有效期一年,可以申請 20 個。

https 簡介

根據 wikipedia 上的介紹:

超文本傳輸安全協議(HyperText Transfer Protocol Secure),縮寫:HTTPS;常稱爲 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一種通過計算機網絡進行安全通信的傳輸協議。HTTPS 經由 HTTP 進行通信,但利用 SSL/TLS 來加密數據包。HTTPS 開發的主要目的,是提供對網站服務器的身份認證,保護交換數據的隱私與完整性。這個協議由網景公司(Netscape)在 1994 年首次提出,隨後擴展到互聯網上。

歷史上,HTTPS 連接經常用於網絡上的交易支付和企業信息系統中敏感信息的傳輸。在 2000 年代末至 2010 年代初,HTTPS 開始廣泛使用,以確保各類型的網頁真實,保護賬戶和保持用戶通信,身份和網絡瀏覽的私密性。

另外,還有一種安全超文本傳輸協議(S-HTTP),也是 HTTP 安全傳輸的一種實現,但是 HTTPS 的廣泛應用而成爲事實上的 HTTP 安全傳輸實現,S-HTTP並沒有得到廣泛支持。

申請HTTPS證書

首先我們需要有一個 https 證書,我們可以從各個雲服務廠商處申請一個免費的,不過自己做實驗沒有必要這麼麻煩,我們可以直接藉助 Java 自帶的 JDK 管理工具 keytool 來生成一個免費的 https 證書。

進入到 %JAVVA_HOME%\bin 目錄下,執行如下命令生成一個數字證書:

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048  -keystore D:\javaboy.p12 -validity 365

注意路徑修改

命令含義如下:

  • genkey 表示要創建一個新的密鑰。
  • alias 表示 keystore 的別名。
  • keyalg 表示使用的加密算法是 RSA ,一種非對稱加密算法。
  • keysize 表示密鑰的長度。
  • keystore 表示生成的密鑰存放位置。
  • validity 表示密鑰的有效時間,單位爲天。

Boot整合HTTPS

接下來我們需要在項目中引入 https。

將上面生成的 javaboy.p12 拷貝到 Spring Boot 項目的 resources 目錄下。然後在 application.properties 中添加如下配置:

server.ssl.key-store=classpath:javaboy.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=111111

其中:

  • key-store表示密鑰文件名。
  • key-alias表示密鑰別名。
  • key-store-password就是在cmd命令執行過程中輸入的密碼。

配置完成後,就可以啓動 Spring Boot 項目了,此時如果我們直接使用 Http 協議來訪問接口,就會看到如下錯誤:

改用 https 來訪問 ,結果如下:

點擊繼續即可訪問!

這是因爲我們自己生成的 https 證書不被瀏覽器認可,不過沒關係,我們直接點擊繼續訪問就可以了(實際項目中只需要更換一個被瀏覽器認可的 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。

結語

Spring Boot 中加入 https 其實很方便。如果你使用了 nginx 或者 tomcat 的話,https 也可以發非常方便的配置,從各個雲服務廠商處申請到 https 證書之後,官方都會有一個詳細的配置教程,一般照着做,就不會錯了。

如有錯誤請留言評論指正!!!

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