一、為什么需要使用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、
TLS簡介:(Transport Layer Security,傳輸層安全協議),用於兩個應用程序之間提供保密性和數據完整性,該協議由兩層組成;TLS記錄協議(用於封裝各種高層協議)和TLS握手協議(提供連接安全具備三個基本屬性)。
- 可以使用非對稱的,或公共密鑰的密碼術來認證對等方的身份。該認證是可選的,但至少需要一個結點方。
- 共享解密密鑰的協商是安全的。對偷竊者來說協商加密是難以獲得的。此外經過認證過的連接不能獲得加密,即使是進入連接中間的攻擊者也不能。
- 協商是可靠的。沒有經過通信方成員的檢測,任何攻擊者都不能修改通信協商。
1.3、區別
在TLS和SSL3.0之間存在着顯著的差別,主要是它們支持的加密算法不同。
1.4、客戶端與服務端使用https傳輸的過程
1.5、密碼體制
要建立一個密碼體制,需要由五個空間組成,分別是:
-
明文M:加密前或解密后的信息;
-
密文C:明文加密后的信息;
-
密鑰K:由加密密鑰和解密密鑰組成;
-
加密E:從明文到密文的變換;
-
解密D:從密文到明文的變換。
二、加密方式(兩種)
1、對稱加密
對稱加密,或者也叫彈鑰加密,是指加密密鑰與解密密鑰相同(或者容易由一個計算出另一個)的加密方式。
對稱加密的優勢:加密、解密運算速度快、效率高。
局限性:密鑰分發復雜、密鑰管理困難、保密通信系統開放性差,數字簽名
代表算法:DES算法、AES算法
2、非對稱加密
非對稱加密是指加密和解密分別使用不同的密鑰,並且不能由加密密鑰推導出解密密鑰的加密方式
非對稱加密的優勢:密鑰分配簡單、便於管理、系統開放性好、可以實現數字簽名
局限性:加密、解密運算效率低
代表算法:RSA算法、ECC算法、國密SM2等
三、證書
要使用SSL,需要有證書,這個證書文件是包含公鑰密鑰,也就是非對稱加密中要使用的。
獲取證書的兩種方式:
- 從CA(Certificate Authority)機構獲取,即客戶端會認可的證書,具有公信力;有免費的也有收費的,收費的比較穩定比較安全。
- 自鑒證書,自己制作證書,一般用於測試,瀏覽器不承認。
本文中采用自鑒證書完成實測示例。
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 即可