自制Https證書並在Spring Boot和Nginx中使用


白話Https一文中, 介紹了Https存在的目的和工作原理,但多是偏向於原理性的介紹,本文介紹如何一步一步自制一個能夠通過瀏覽器認證的Https證書,並講解在Spring Boot環境和Nginx環境中服務器端的配置。

如果你還沒有讀過白話Https,我強烈建議你先去讀一下。按照白話Https中的介紹,Https協議涉及到的主體主要有三個:客戶端、服務端、以及CA機構。如下圖所示:

Https Role

在白話Https一文中,曾介紹一個服務要申請使用Https的流程。本文所介紹的流程,針對自制Https證書,更多的面向測試場景,當然了,有些網站,比如像12306這樣的,也會自制根證書要求用戶安裝。既然是要DIY,當然也要分別在三個主體上做工作。

證書頒發機構

  • CA機構私鑰
openssl genrsa -out ca.key 2048
  • CA證書
openssl req -x509 -new -key ca.key -out ca.crt

注意生成過程中需要輸入一些CA機構的信息

服務端

  • 生成服務端私鑰
openssl genrsa -out server.key 2048
  • 生成服務端證書請求文件
openssl req -new -key server.key -out server.csr

注意生成過程中需要你輸入一些服務端信息

  • 使用CA證書生成服務端證書
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt

關於sha256,默認使用的是sha1,在新版本的chrome中會被認為是不安全的,因為使用了過時的加密算法。

  • 打包服務端的資料為pkcs12格式(非必要,只是換一種格式存儲上一步生成的證書)
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pkcs12

生成過程中,需要創建訪問密碼,請記錄下來。

  • 生成服務端的keystore(.jks文件, 非必要,Java程序通常使用該格式的證書)
keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12

生成過程中,需要創建訪問密碼,請記錄下來。

  • 把ca證書放到keystore中(非必要)
keytool -importcert -keystore server.jks -file ca.crt

客戶端

  • 導入根證書ca.crt到瀏覽器受信任的根證書頒發機構列表中

不管通過什么瀏覽器吧,總之你要找到下面這個頁面,點擊導入,將上面生成的CA機構的ca.crt導入到收信任的根證書頒發機構列表中。

import ca.crt

注意,收信任的根證書頒發機構列表是操作系統級的,不管通過哪個瀏覽器進入配置,都是只需要配置一次,再使用其它瀏覽器時,無需重復配置。

Spring Boot

Spring Boot為web容器提供了統一的抽象配置,不管你使用的是Tomcat是Jetty還是其它web容器,如果要在Spring Boot中使用Https,你只需要在你的配置類中,添加如下代碼,注冊一個EmbeddedServletContainerCustomizer Bean即可。

需要用到上面生成的Server.jks文件。

@Configuration
public class WebConfig {

    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return new EmbeddedServletContainerCustomizer() {
            @Override
            public void customize(ConfigurableEmbeddedServletContainer container) {
                Ssl ssl = new Ssl();
                ssl.setKeyStore("Server.jks");
                ssl.setKeyStorePassword("passwd");
                container.setSsl(ssl);
                container.setPort(8443);
            }
        };
    }
}

Nginx

如果要在Nginx中使用Https,需要用到上面生成的Server.crt,Server.key。

server {
    listen      127.0.0.1:443 ssl;
    
    ssl on;
    ssl_certificate Server.crt;
    ssl_certificate_key Server.key;

    #省略無關配置...  
}

總結

  1. crt、jks、pkcs12都是用來保存證書的不同格式,不同的服務器軟件可能會使用不同格式的證書文件。
  2. OpenSSl、Keytool都是可以用來生成Https證書的工具軟件,其中OpenSSl功能更多更復雜,Keytool隨JDK安裝而安裝。
  3. 證書的格式是多樣的,生成證書的軟件工具有很多,不同服務器程序的配置方法不盡相同,要達成目的有很多種方法。所以,重要的是弄懂原理,而不是按照教程一步一步敲命令。
  4. 跟白話Https一樣,本文仍然沒有介紹服務端怎么驗證客戶端,但如果你弄懂了原理,我想你已經可以自己去實現了。


免責聲明!

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



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