Springboot整合https原來這麼簡單

来源:https://www.cnblogs.com/larrydpk/archive/2020/04/26/12782593.html
-Advertisement-
Play Games

1 簡介 是不安全的,我們需要給它套上 ,讓它變成 。本文章將用實例介紹 整合 。 2 密碼學基礎 要談 就要談 ,自然就要談安全;談及安全,就必然涉及密碼學的一些知識。 2.1 密碼體制 要建立一個密碼體制,需要由五個空間組成,分別是: 明文M:加密前或解密後的信息; 密文C:明文加密後的信息; ...


1 簡介

HTTP是不安全的,我們需要給它套上SSL,讓它變成HTTPS。本文章將用實例介紹Springboot整合HTTPS

2 密碼學基礎

要談https就要談Security,自然就要談安全;談及安全,就必然涉及密碼學的一些知識。

2.1 密碼體制

要建立一個密碼體制,需要由五個空間組成,分別是:

  • 明文M:加密前或解密後的信息;

  • 密文C:明文加密後的信息;

  • 密鑰K:由加密密鑰和解密密鑰組成;

  • 加密E:從明文到密文的變換;

  • 解密D:從密文到明文的變換。

如圖所示:

Cryptography

2.2 兩種加密方式

2.2.1 對稱加密

對稱加密,或者也叫單鑰加密,是指加密密鑰和解密密鑰相同(或者容易由一個計算出另一個)的加密方式。

對稱加密的主要優勢是:加密、解密運算速度快,效率高;

局限性:密鑰分發複雜,密鑰管理困難,保密通信系統開放性差,數字簽名;

代表演算法:DES演算法、AES演算法;

舉個小例子

明文為48,加密演算法f(x)=8x+71,
則密文C=8*48+71=455
則解密演算法為f(x)=(x-71)/8;
則解密後的明文M=(455-71)/8=48;

2.2.2 非對稱加密

非對稱加密是指加密和解密分別使用不同的密鑰,並且不能由加密密鑰推導出解密密鑰的加密方式。

主要優勢:密鑰分配簡單,便於管理,系統開放性好,可以實現數字簽名;

局限性:加密、解密運算效率較低;

代表演算法:RSA演算法、ECC演算法;

舉個大例子

步驟如下:

Step Description Formula Note
1 找出兩個質數 P、Q
2 計算公共模數 N=P*Q
3 計算歐拉函數 φ(N) = (P-1)(Q-1)
4 計算公鑰E 1 < E < φ(N) E的取值必須是整數 E 和 φ(N) 必須是互質數
5 計算私鑰D E * D % φ(N) = 1
6 加密 C = M^E mod N C:密文 M:明文
7 解密 M =C^D mod N C:密文 M:明文

其中,公鑰=(E , N) ,私鑰=(D, N),對外,我們只暴露公鑰。

1.找出兩個質數
隨便找兩個質數,我們找P=5,Q=11。

2.計算公共模數
公共模數N=P*Q=5*11=55

3.計算歐拉函數
φ(N) = (P-1)(Q-1)=4*10=40

4.計算公鑰E
1 < E < φ(N),我們取E=13

5.計算私鑰D
(13*D)%40=1,則取D=37

6.加密
假設要傳輸的明文為8,使用公鑰(E,N)=(13,55)加密
通過公式C = M^E mod N=8^13%55=28

7.解密
使用密鑰(D,N)=(37,55)解密
解密M =C^D mod N=28^37%55=8


另外,我們可以用私鑰加密,公鑰解密,
如明文為2,則用私鑰(37,55)加密密文C=(2^37)%55=7
用公鑰(13,55)解密M=(7^13)%55=2。

至此,整個非對稱加密過程演示了一遍,希望大家能理解,特別是非對稱加密,因為HTTPS使用的是非對稱加密。實際的使用演算法更複雜,密鑰長度會更大。

2.3 證書

要使用SSL,需要有證書,這個證書文件是包含公鑰密鑰,也就是非對稱加密中要使用的。

獲取證書有兩種方式:

  • CA(Certificate Authority)機構獲取,即客戶端會認可的證書,具有公信力;有免費也有收費的,收費的比較穩定比較安全。
  • 自簽證書,自己製作證書,一般用於測試,瀏覽器不承認。

為方便起見,在本次實例中使用自簽證書,兩種證書整合過程並無差異。

3 Springboot整合HTTPS

3.1 先讓Web跑起來

作為一個Web應用,我們先讓它跑起來,然後再整合https

(1)引入Web依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

(2)配置埠:

server.port=80

(3)實現Contrlloer

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Welcome to www.pkslow.com";
    }
}

完成上面工作後,啟動應用即可。

訪問http://localhost/hello 得到下麵結果,說明整個Web應用起來了。

HTTP

3.2 生成密鑰文件jks

通過命令行生成密鑰文件如下:

keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore localhost.jks -dname CN=localhost,OU=Test,O=pkslow,L=Guangzhou,C=CN -validity 731 -storepass changeit -keypass changeit

命令行重要參數的意義:

  • alias:密鑰別名,可以隨便起,不衝突就行;

  • keyalg:加密演算法;

  • keysize:密鑰長度,2048基本就不可能破解了;

  • keystore:keystore的文件名;

  • dname:這個很關鍵,特別是CN=後面要按正確的功能變數名稱來寫;

  • validity:cert的有效期;

執行完以上命令後,就會生成localhost.jks文件,把該文件放到classpath下即可,當然也可以放到其它位置,配置文件指定正確即可。

3.3 重新配置並重啟

按照實際情況重新配置application.properties文件:

server.port=443

server.ssl.enabled=true
server.ssl.key-store-type=jks
server.ssl.key-store=classpath:localhost.jks
server.ssl.key-store-password=changeit
server.ssl.key-alias=localhost

重啟後訪問如下:

HTTPS Fail

發現有紅色警告,因為這是自簽名的cert,並不被Chrome所認可,所以會校驗失敗。以前的Chrome版本只是警告,但還是可以訪問的,現在新版本的已經不能訪問了。

通過Postman來訪問便可:

Https Postman

3.4 使用PKS12格式

如果想使用PKCS12替換JKS,命令和配置可以參考下麵:

生成密鑰:

keytool -genkey -alias localhost -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -storetype PKCS12 -keystore localhost.p12 -dname CN=localhost,OU=Test,O=pkslow,L=Guangzhou,C=CN -validity 731 -storepass changeit -keypass changeit

配置文件如下:

server.port=443

server.ssl.enabled=true
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:localhost.p12
server.ssl.key-store-password=changeit
server.ssl.key-alias=localhost

總結

本文簡單介紹了一些密碼學的基礎和如何通過Springboot整合HTTPS。本文詳細代碼可在南瓜慢說公眾號回覆<SpringbootSSLBasic>獲取。

其實,SSL非常複雜,知識點非常多。後續文章會繼續介紹密鑰工具、重定向、Reactive整合、雙向驗證等。


歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!

歡迎關註微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 賦值 基本類型: 傳值,在棧記憶體中的數據發生數據變化的時候,系統會自動為新的變數分配一個新的之值在棧記憶體中,兩個變數相互獨立,互不影響的 引用類型: 傳址,只改變指針的指向,指向同一個對象,兩個變數相互干擾 淺拷貝 對於基本類型,淺拷貝是對值的複製,拷貝前後對象的基本數據類型互不影響 對於引用類型來 ...
  • 系統模塊劃分設計的思考 前言 首先明確一下,這裡所說的系統模塊劃分,是針對client,service,common這樣的技術劃分,而不是針對具體業務的模塊劃分。避免由於歧義,造成你的時間浪費。 直接原因 公司內部某技術團隊,在引用我們系統的client包時,啟動失敗。 失敗原因是由於client下 ...
  • Flutter中如何實現沉浸式透明Statusbar狀態欄效果? 如下圖:狀態欄是指android手機頂部顯示手機狀態信息的位置。android 自4.4開始新加入透明狀態欄功能,狀態欄可以自定義顏色背景,使titleBar能夠和狀態欄融為一體,增加沉浸感。 如上圖Flutter狀態欄預設為黑色半透 ...
  • 背景 這裡的kafka值得是broker,broker消息丟失的邊界需要對齊一下: 1 已經提交的消息 2 有限度的持久化 如果消息沒提交成功,並不是broke丟失了消息; 有限度的持久化(broker可用) 生產者丟失消息 這個發送消息的方式是非同步的;fire and forget,發送而不管結果 ...
  • 本文基於 JDK1.8 闡述分析 運行過程 我們都知道 Java 源文件通過編譯器編譯後,能產生相應的 .Class 文件,也就是位元組碼文件。而位元組碼文件通過 Java 虛擬機中的解釋器,編譯成特定機器上的機器碼。 跨平臺的特性 Java 能跨平臺的原因是因為:不同的平臺有不同的 JVM 版本,一個 ...
  • 參考https://www.cnblogs.com/xenny/p/9739600.html 樹狀數組與線段樹的區別 1. 兩者在複雜度上同級, 但是樹狀數組的常數明顯優於線段樹, 其編程複雜度也遠小於線段樹. 2. 樹狀數組的作用被線段樹完全涵蓋, , 但是線段樹能夠解決的問題樹狀數組未必能夠解決 ...
  • 什麼是while迴圈: while語句也稱條件判斷語句,它的迴圈方式是利用一個條件來控制是否要繼續反覆執行這個語句。 他的語法是 while( 條件表達式){ 執行 語句 } 他的特點是:先判斷,後執行迴圈操作。 概念:一直重覆做有開始有結束的事情。 特征為: 條件:開始結束的條件。 操作:一直重覆 ...
  • npm run dev 報錯,這個錯誤好像還遇到挺多次的,這次特地記錄一下,反正錯誤翻譯過來就是模塊生成失敗:錯誤:找不到模塊“node sass” 需要堆棧:....這大概意思就是下載node sass失敗唄 我這裡是這麼做法就成功了 首先執行:npm install g cnpm registr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...