Spring Boot 支持 Https 有那麼難嗎?

https 如今已經愈來愈普及了,特別是作一些小程序或者公衆號開發的時候,https 基本上都是剛需了。java

不過一個 https 證書仍是挺費錢的,我的開發者能夠在各個雲服務提供商那裏申請一個免費的證書。我印象中有效期一年,能夠申請 20 個。nginx

今天要和你們聊的是在 Spring Boot 項目中,如何開啓 https 配置,爲咱們的接口保駕護航。算法

https 簡介

咱們先來看看什麼是 https,根據 wikipedia 上的介紹:apache

超文本傳輸安全協議(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 證書,咱們能夠從各個雲服務廠商處申請一個免費的,不過本身作實驗沒有必要這麼麻煩,咱們能夠直接藉助 Java 自帶的 JDK 管理工具 keytool 來生成一個免費的 https 證書。tomcat

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

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

命令含義以下:bash

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

具體生成過程以下圖:

命令執行完成後 ,咱們在 D 盤目錄下會看到一個名爲 javaboy.p12 的文件。以下圖:

有了這個文件以後,咱們的準備工做就算是 OK 了。

引入 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 證書便可)。

請求轉發

考慮到 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。

結語

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

關注公衆號【江南一點雨】,專一於 Spring Boot+微服務以及先後端分離等全棧技術,按期視頻教程分享,關注後回覆 Java ,領取鬆哥爲你精心準備的 Java 乾貨!

相關文章
相關標籤/搜索