自制https證書:SpringBoot+SpringCloud
文章目錄
一. 證書相關介紹
1.1 https與http的區別?
-
HTTP(超文本傳輸協議)被用於在Web瀏覽器和網站服務器之間,以明文方式傳遞信息,不提供任何方式的數據加密,因此使用HTTP協議傳輸隱私信息(如:銀行卡號、密碼等支付信息)非常不安全。
-
爲了解決這一安全缺陷,網景公司設計了SSL(Secure Sockets Layer)協議,在HTTP的基礎上加入了SSL(Secure Sockets Layer)協議,SSL依靠SSL證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通信加密。從而誕生了HTTPS(安全套接字層超文本傳輸協議)。
-
簡單來說,HTTPS協議="SSL+HTTP協議"構建的可進行加密傳輸、身份認證的網絡協議,是HTTP的安全版。
簡單來說,使用https相當於在傳輸過程中對數據進行了加密,不容易被第三方所竊取,安全性更高。而http請求就等於在裸奔…
1.2 使用https的場景有哪些?
-
業務系統需要符合相關安全評測的要求。
如業務系統需要通過信息安全測評、等級保護測評等上級主管部門安全要求,而評測細則中明確要求網站必須通過https方式進行加密。 -
提高網站在搜索引擎中的排名。
採用https進行網站的部署,可以明顯提高網站在同類行業中的排名優先級,提高站點的可信度、品牌形象。 -
提高網站的安全性。
全站Https是根治中間人流量劫持的解決方案,不僅可以杜絕網頁中被插入小廣告,更可以保護用戶隱私安全。
1.3 安裝證書後的圖示?
- 安裝前,前綴是http:
- 安裝證書後,前綴是https:
安裝https服務且有安全證書後,會有一個鎖 的圖樣;一般網上的證書是需要收費的,用戶自身不需要安裝密鑰。我們自己製作的證書需要給瀏覽方一個認證證書,可以一樣達到收費證書的效果!
二. 實戰安裝配置操作
2.1 製作證書
- windows先按 win+R,在打開窗口中輸入cmd:
- 然後按Enter確定,進入小黑窗口界面:
- 利用keyTool生成自制證書:
keytool -genkey -alias client -keypass 123456 -keyalg RSA -storetype PKCS12 -keypass 123456 -storepass 123456 -keystore d:/client.p12 -ext san=dns:spam,ip:127.0.0.1
這裏的ip是127.0.0.1,線上肯定不是這個地址,我們可以用自身實際ip地址替換即可;生成的證書默認爲3個月,我們可以增加參數延長指定時間;
- keyTool 相關其他參數:
參數名 | 含義 |
---|---|
-genkey | xxx |
-alias tomcat | 別名 |
-keypass 123456 | 別名密碼 |
-keyalg RSA | 生證書的算法名稱,RSA是一種非對稱加密算法 |
-keysize 1024 | 密鑰長度,證書大小 |
-validity 365 | 證書有效期,天單位 |
-keystore W:/tomcat.keystore | 指定生成證書的位置和證書名稱 |
-storepass 123456 | 獲取keystore信息的密碼 |
-storetype | 指定密鑰倉庫類型 |
- 我們這裏利用keyTool生成自制證書(10年有效期)
keytool -genkey -alias client -keypass 123456 -keyalg RSA -storetype PKCS12 -keypass 123456 -storepass 123456 -keystore d:/client.p12 -ext san=dns:spam,ip:127.0.0.1 -validity 3650
結尾用到了-validity 1095,將證書的有效期延長。生成的證書被保存在了d盤的根目錄下,名字叫:client.p12 。如果我們沒有d盤或者不想生成在d盤是可以自己手動更改生成地址的。
- 生成命令如圖:
- 後面填寫的信息自己任意填寫即可,如圖所示:
- 十年有效期截圖:
2.2 生成祕鑰
- 生成了證書後,需要瀏覽方自己保存一份密鑰。生成命令如下:
keytool -export -alias client -keystore d:/client.p12 -storetype PKCS12 -keypass 123456 -file d:/client.cer
執行此命令後即生成了兩個文件。在D盤的根目錄下面:client.p12,client.cer。輸入密碼時,輸入123456即可。因爲我們配置的密碼時123456。
2.3 集成到項目中
- 將client.p12放入Spring Gateway網關的resources目錄下,在Spring Gateway網關配置文件中加入以下配置:
server: ssl: key-store: classpath:client.p12 key-store-password: 123456 keyStoreType: PKCS12 keyAlias: client spring: cloud: gateway: httpclient: ssl: useInsecureTrustManager: true
- 前後端使用https進行聯通,但是我們內部的網關到微服務之間仍然使用http進行數據交互。所以我們需要加以下配置類:
package com.xxx.config; import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Mono; import java.net.URI; /** * @program: xxxx * @description: 網關調用內部工程時將https轉成http * @author: anyu * @create: 2020-04-03 */ @Component public class SchemeFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { Object uriObj = exchange.getAttributes().get(GATEWAY_REQUEST_URL_ATTR); if (uriObj != null) { URI uri = (URI) uriObj; uri = this.upgradeConnection(uri, "http"); exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, uri); } return chain.filter(exchange); } private URI upgradeConnection(URI uri, String scheme) { UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUri(uri).scheme(scheme); if (uri.getRawQuery() != null) { // When building the URI, UriComponentsBuilder verify the allowed characters and does not // support the '+' so we replace it for its equivalent '%20'. // See issue https://jira.spring.io/browse/SPR-10172 uriComponentsBuilder.replaceQuery(uri.getRawQuery().replace("+", "%20")); } return uriComponentsBuilder.build(true).toUri(); } @Override public int getOrder() { return 10101; } }
- 自此,後端配置完成;如果加了證書之後,在啓動網關服務時報編碼解析等錯誤,需要在pom.xml的build中加入下面的依賴:
</build> <resources> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>certificate/*.jks</exclude> </excludes> </resource> </resources> </build>
2.4 使用前的準備:
- 第一步,我們需要更新部署我們的代碼。
- 第二步,我們需要導入瀏覽器我們的安全證書:
- 找到client.cer,雙擊鼠標左鍵打開,然後看到如圖界面:
- 選擇安裝證書,然後選擇當前用戶,再選擇將所有證書都放入下列存儲,點擊瀏覽,選擇受信任的頒發機構,點擊確定即可導入成功。
如果證書不生效,且之前已經安裝過這個項目的證書的,可以刪除之前的證書即可。
安裝證書如圖所屬示 - 找到client.cer,雙擊鼠標左鍵打開,然後看到如圖界面:
- 第三步,打開瀏覽器進行訪問:
https://ip:端口號/swagger-ui.html
筆者項目中使用的swagger-ui,所以可以直接查看後端生成的文檔頁面。你們如果沒有安裝swagger的可以直接使用工具調接口嘗試,記住現在開始,是https啦~
三. 文章總結
- 總結:
- 介紹了http與https的區別,並概述了爲什麼要使用https。
- 介紹了https的證書,密鑰的生成和安裝。
- 介紹瞭如何將證書導入到微服務項目中。
- 介紹瞭如何驗證是否安裝完成。