【Spring】Spring Boot 支持 Https

1.美圖

在這裏插入圖片描述

2.概述

https 現在已經越來越普及了,特別是做一些小程序或者公衆號開發的時候,https 基本上都是剛需了。

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

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

3.https 簡介

我們先來看看什麼是 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並沒有得到廣泛支持。

3.準備工作

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

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

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

命令含義如下:

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

具體生成過程如下圖:

[lcc@lcc ~/soft/spring]$ keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore ./javaboy.p12 -validity 365
輸入密鑰庫口令:
再次輸入新口令:
您的名字與姓氏是什麼?
  [Unknown]:  lcc
您的組織單位名稱是什麼?
  [Unknown]:  lcc
您的組織名稱是什麼?
  [Unknown]:  lcc
您所在的城市或區域名稱是什麼?
  [Unknown]:  杭州
您所在的省/市/自治區名稱是什麼?
  [Unknown]:  閒閒蕭山
該單位的雙字母國家/地區代碼是什麼?
  [Unknown]:  330109
CN=lcc, OU=lcc, O=lcc, L=杭州, ST=蕭山, C=330109是否正確?
  []:  Y

輸入 <tomcathttps> 的密鑰口令
	(如果和密鑰庫口令相同, 按回車):

Warning:
JKS 密鑰庫使用專用格式。建議使用 "keytool -importkeystore -srckeystore ./javaboy.p12 -destkeystore ./javaboy.p12 -deststoretype pkcs12" 遷移到行業標準格式 PKCS12。
[lcc@lcc ~/soft/spring]$ ll
total 32
drwxr-xr-x@  6 lcc  staff   192  7  6 17:15 ./
drwxr-xr-x@ 45 lcc  staff  1440  7  2 09:13 ../
-rw-r--r--@  1 lcc  staff  6148 12 31  2019 .DS_Store
-rw-r--r--   1 lcc  staff  2218  7  6 17:15 javaboy.p12
drwxr-xr-x@  8 lcc  staff   256 11 16  2015 spring-1.3.0.RELEASE/

命令執行完成後 ,會在你指定的目錄下生成javaboy.p12文件。

4.引入 https

創建Spring項目。項目結構如下
在這裏插入圖片描述
controller如下

package com.spring.boot.https.demo.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/message")
public class MessageController {


    @RequestMapping(value="hello",method = RequestMethod.GET)
    @ResponseBody
    public JSONObject hello(){
        return JSON.parseObject("{\"code\":0,\"message\":\"dd\"}");
    }

    @RequestMapping(value="success",method = RequestMethod.POST)
    @ResponseBody
    public JSONObject add(@RequestBody String aa){
        System.out.println(aa);
        return JSON.parseObject("{\"code\":0,\"message\":\"dd\"}");
    }
}

接下來我們需要在項目中引入 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=123456

其中:

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

配置完成後,就可以啓動 Spring Boot 項目了,此時如果我們直接使用 Http 協議來訪問接口,就會看到如下錯誤:
在這裏插入圖片描述
改用 https 來訪問 ,結果如下:
在這裏插入圖片描述

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

這裏請參看:在chrome該頁面上,直接鍵盤敲入這11個字符:thisisunsafe
在這裏插入圖片描述

5.請求轉發

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

6. 客戶端如何訪問

參考:Apache HttpClient 4.5實現https

7.結語

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

參考:

作者:江南一點雨
鏈接:https://segmentfault.com/a/1190000020052375
來源:SegmentFault 思否
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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