自制https證書:SpringBoot+SpringCloud

自制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的場景有哪些?

  1. 業務系統需要符合相關安全評測的要求。
    如業務系統需要通過信息安全測評、等級保護測評等上級主管部門安全要求,而評測細則中明確要求網站必須通過https方式進行加密。

  2. 提高網站在搜索引擎中的排名。
    採用https進行網站的部署,可以明顯提高網站在同類行業中的排名優先級,提高站點的可信度、品牌形象。

  3. 提高網站的安全性。
    全站Https是根治中間人流量劫持的解決方案,不僅可以杜絕網頁中被插入小廣告,更可以保護用戶隱私安全。

1.3 安裝證書後的圖示?

  • 安裝前,前綴是http:
    在這裏插入圖片描述
  • 安裝證書後,前綴是https:
    在這裏插入圖片描述

安裝https服務且有安全證書後,會有一個鎖 的圖樣;一般網上的證書是需要收費的,用戶自身不需要安裝密鑰。我們自己製作的證書需要給瀏覽方一個認證證書,可以一樣達到收費證書的效果!

二. 實戰安裝配置操作

2.1 製作證書

  1. windows先按 win+R,在打開窗口中輸入cmd:
    在這裏插入圖片描述
  2. 然後按Enter確定,進入小黑窗口界面:
    在這裏插入圖片描述
  3. 利用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盤是可以自己手動更改生成地址的。

  • 生成命令如圖:
    在這裏插入圖片描述
  1. 後面填寫的信息自己任意填寫即可,如圖所示:
    在這裏插入圖片描述
  • 十年有效期截圖:
    在這裏插入圖片描述

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 集成到項目中

  1. 將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
    
  2. 前後端使用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;
        }
    }
    
  3. 自此,後端配置完成;如果加了證書之後,在啓動網關服務時報編碼解析等錯誤,需要在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 使用前的準備:

  1. 第一步,我們需要更新部署我們的代碼。
  2. 第二步,我們需要導入瀏覽器我們的安全證書:
    • 找到client.cer,雙擊鼠標左鍵打開,然後看到如圖界面:
      在這裏插入圖片描述
    • 選擇安裝證書,然後選擇當前用戶,再選擇將所有證書都放入下列存儲,點擊瀏覽,選擇受信任的頒發機構,點擊確定即可導入成功。

    如果證書不生效,且之前已經安裝過這個項目的證書的,可以刪除之前的證書即可。
    安裝證書如圖所屬示在這裏插入圖片描述

  3. 第三步,打開瀏覽器進行訪問:
    https://ip:端口號/swagger-ui.html
    

    筆者項目中使用的swagger-ui,所以可以直接查看後端生成的文檔頁面。你們如果沒有安裝swagger的可以直接使用工具調接口嘗試,記住現在開始,是https啦~

三. 文章總結

  • 總結:
    1. 介紹了http與https的區別,並概述了爲什麼要使用https。
    2. 介紹了https的證書,密鑰的生成和安裝。
    3. 介紹瞭如何將證書導入到微服務項目中。
    4. 介紹瞭如何驗證是否安裝完成。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章