SpringBoot 改造成 https訪問


一、為什么需要使用Https(安全套接字層超文本傳輸協議)

1.1、因為http是明文傳輸不安全,我們需要加上SSL/TLS,建立一個安全的通道,保證數據傳輸的安全;確認網站的真實性,驗證服務器的身份。

Https = Http + SSL/TLS

1.2、SSL與TLS的區別

1.2.1、

SSL簡介:(Secure Socket Layer,安全套接字層),位於可靠的面向連接的網絡層協議和應用層協議之間的一種協議層。SSL通過互相認證、使用數字簽名確保完整性、使用加密確保私密性、以實現客戶端和服務器之間的安全通訊。協議有兩層組成:SSL記錄協議(為高層協議提供數據封裝、壓縮、加密等基本功能的支持)和SSL握手協議(建立在記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等)。

SSL協議位於TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。

1.2.2、

SSL協議提供的服務主要有:

  1. 認證用戶和服務器,確保數據發送到正確的客戶機和服務器;
  2. 加密數據以防止數據中途被竊取
  3. 維護數據的完整性,確保數據在傳輸過程中不被改變

1.2.3、

TLS簡介:(Transport Layer Security,傳輸層安全協議),用於兩個應用程序之間提供保密性和數據完整性,該協議由兩層組成;TLS記錄協議(用於封裝各種高層協議)和TLS握手協議(提供連接安全具備三個基本屬性)。

  1. 可以使用非對稱的,或公共密鑰的密碼術來認證對等方的身份。該認證是可選的,但至少需要一個結點方。
  2. 共享解密密鑰的協商是安全的。對偷竊者來說協商加密是難以獲得的。此外經過認證過的連接不能獲得加密,即使是進入連接中間的攻擊者也不能。
  3. 協商是可靠的。沒有經過通信方成員的檢測,任何攻擊者都不能修改通信協商。

1.3、區別

在TLS和SSL3.0之間存在着顯著的差別,主要是它們支持的加密算法不同。

1.4、客戶端與服務端使用https傳輸的過程

 

1.5、密碼體制

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

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

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

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

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

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

 

二、加密方式(兩種)

1、對稱加密

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

對稱加密的優勢:加密、解密運算速度快、效率高。

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

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

2、非對稱加密

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

非對稱加密的優勢:密鑰分配簡單、便於管理、系統開放性好、可以實現數字簽名

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

代表算法:RSA算法、ECC算法、國密SM2等

 

三、證書

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

獲取證書的兩種方式:

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

本文中采用自鑒證書完成實測示例。

1、生成自鑒證書

1.1、找到jdk的安裝路徑

1.2、由於jdk是安裝在C盤中所以需要使用管理員身份去生成證書,否則在生成證書的時候會報權限錯誤

1.3、在終端進去到jdk的bin目錄下執行以下命令生成密鑰證書

(1)keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650

以上命令參數說明:

  • alias  密鑰別名
  • storetype 指定密鑰倉庫類型
  • keyalg 生證書的算法名稱,RSA是一種非對稱加密算法
  • keysize 證書大小
  • keystore 生成的證書文件的存儲路徑
  • validity 證書的有效期

(2)生成證書注意點:

密鑰庫口令:證書密碼,在后面的項目中配置證書時用到

  • 姓氏:一般沒什么用,在瀏覽器中查看證書時會顯示,用於正式場合的證書還是需要填寫標准。
  • 組織單位:證書使用單位信息,一般沒什么用,在瀏覽器中查看證書時會顯示,用於正式場合的證書還是需要填寫標准。
  • 組織單位名稱:證書使用單位名稱,一般沒什么用,在瀏覽器中查看證書時會顯示,用於正式場合的證書還是需要填寫標准。
  • 所在的城市或區域名稱:瀏覽器中查看證書信息時會顯示。
  • 所在的省/市/自治區名稱:瀏覽器中查看證書信息時會顯示。
  • 單位的雙字母國家/地區代碼:國家或地區編碼,瀏覽器中查看證書信息時會顯示。

(3)生成的密鑰證書路徑 keystore.p12

 

(4)將此文件拷貝至項目中

 

 四、編寫測試程序

(1)該Demo示例的pom.xml依賴配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xdh</groupId>
    <artifactId>https-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>https-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

(2)application.properties配置文件的配置

server.port=1998
#證書的路徑.密鑰文件的路徑、也可以配置絕對路徑
server.ssl.key-store=classpath:keystore.p12
#證書密碼,密鑰生成時在終端輸入的密鑰庫口令
server.ssl.key-store-password=123456
#秘鑰庫類型,與密鑰生成命令一致
server.ssl.keyStoreType=PKCS12
#證書別名,與密鑰生成命令一致
server.ssl.keyAlias=tomcat
#http端口號
server.additionalPorts=1999,1997
(3)TestController入口
@Controller
@RequestMapping(value = "/testController",method = RequestMethod.GET)
public class TestController {

    @GetMapping("/test")
    @ResponseBody
    public String test(@RequestParam Map<String, Object> params) {
        params.put("name","張三");
        System.out.println(params);
        String name = String.valueOf(params.get("name"));
        return "你好" + name;
    }
}
(4)HttpsDemoApplication 啟動類
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HttpsDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(HttpsDemoApplication.class, args);
    }
}

(5)啟動程序后在Google瀏覽器測試

***如果測試的時候谷歌瀏覽器報錯:你的連接不是私密連接。解決方案如下:

  • 在chrome強制跳轉https,刪除對某個域名的強制專跳即可。
  • 在chrome的地址欄輸入:chrome://net-internals/#hsts
  • 在delete domain下輸入相應的網址,不帶http的,只需要www開頭,接着按下delete即可。

例如:我本來是想輸入 https://localhost:1998/testController/test 這個地址,在delete domain下輸入localhost:1998/testController/test 即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM