使用 KeyStore Explorer 簽發(fā) SAN 二級證書在 SpringBoot 中使用

需要生成一個 CA 根證書并以此簽發(fā)二級證書,二級證書將作為服務端證書
服務端證書需要附加 SAN (Subject Alternative Name) (使用者可選名稱) 信息

場景:

  • 需要生成一個 CA 根證書并以此簽發(fā)二級證書,二級證書將作為服務端證書
  • 服務端證書需要附加 SAN (Subject Alternative Name) (使用者可選名稱) 信息,示例如下


    image.png
  • 最終需要導出為 p12 格式的文件給 SpringBoot 使用

方案:

1. 下載安裝

下載 KeyStore Explorer (一個 keytool 的 GUI 工具),其 GitHub 和官網(wǎng)地址如下

https://github.com/kaikramer/keystore-explorer
https://keystore-explorer.org/

個人建議去 GitHub 上下載 zip 包,雖然略微大一些,但可以免安裝,解壓即用
另外,以下內(nèi)容均在 5.5.0 版本下截圖演示

2. 新建 KeyStore

點擊 create a new KeyStore


image.png

格式默認選擇 pkcs #12 就行


image.png

新建之后 Ctrl + S 保存一下,此時需要填寫密碼,這里自己隨意設置(但要能記得?。?,此處演示均使用 123456
image.png

保險起見,保存的時候 Files of Type 下拉框也選擇 p12 那個,另外 File Name 需要自己加上 .p12 的后綴名(反正我這個版本不會自動加后綴)


image.png

3. 創(chuàng)建根證書

首先需要創(chuàng)建一個密鑰對 (Key Pair),空白處右鍵第一個就是了

image.png

此處可選算法,一般 RSA 2048 就行
image.png

之后有幾處需要注意,一個是有效期 Validity Period ,根據(jù)自己的需要填;再個就是 Name 最右邊的
按鈕,這個一定要點進去填;最后是 Add Extensions 按鈕,這個目前可以先不填,但是生成二級證書添加 SAN 信息的時候就需要用到了
image.png

點擊上圖 Name 最右邊的按鈕之后,就是這個窗口,這些都需要填,按自己的需求填寫就好,此處我均填寫為 ca
image.png

然后填寫別名
image.png

最后,這里是個坑,此處密鑰對的密碼可以設為和之前 KeyStore 不一樣的,但是會影響到后面 SpringBoot 中的配置,如果只是個人學習使用,避免麻煩,那就設為和 KeyStore 一致的。
演示中密碼均為 123456
image.png

然后就得到了一個 CA 根證書的密鑰對
image.png

莫得結束,此時只得到了密鑰對,并不是證書,右鍵剛剛生成的密鑰對,Export -> Export Certificate Chain
image.png

之后選擇格式和保存位置,格式一般默認就行,保存位置自己選
image.png

目前得到的文件如下:
image.png

4. 創(chuàng)建并簽發(fā)二級證書

如果是用過命令行工具的朋友應該知道簽發(fā)二級證書的過程應該是 生成 key pair -> 生成 csr 請求 -> 簽發(fā)并生成 cer 證書

不過 KeyStore Explorer 工具提供了一個便捷的方式,直接在 ca 密鑰對上右鍵 -> Sign -> Sign New Key Pair 即可從生成密鑰對到簽發(fā)一氣呵成


image.png

之后需要輸入這個密鑰對的密碼,和之前設置的一致就行


image.png

再之后的過程和上面創(chuàng)建新密鑰對的過程差不多,但此時為了給 server 證書添加 SAN 附加信息,就需要用到 Add Extensions 按鈕了
image.png

點進來是這樣的,選擇使用標準模板


image.png

模板選擇 SSL Server
image.png

然后會自動生成很多附加信息,選擇 要修改的 Subject Alternative Name ,點擊右邊的修改按鈕
image.png

此處就可以修改增刪改 SAN 信息了
image.png

增改的窗口如下,常用的是 DNS 和 IP 兩種,下方直接填寫值即可
image.png

演示中最終填寫的 SAN 值如下


image.png

最后最后,別忘了點那個像書一樣的按鈕,填寫 Name 部分,否則一定會報錯無法繼續(xù)的
image.png

之后也會填寫密碼,為了方便可填為和 KeyStore 一致的,此處就不貼圖了

現(xiàn)在得到了兩個密鑰對,server 就是帶有 SAN 信息的服務端密鑰對了,別忘了 Ctrl + S 保存一下


image.png

此時,我們可以像導出 ca 根證書那樣導出這個 server 證書,但在 SpringBoot 中使用的話,并不需要這一步,直接把這份 test.p12 交給 SpringBoot 就好。

5. 在 SpringBoot 中使用

把這份 test.p12 放在 resources 目錄下,然后在配置文件 application.properties 中這樣寫

#https端口號
server.port=443
#密鑰庫路徑
server.ssl.key-store=classpath:test.p12
#密鑰庫密碼
server.ssl.key-store-password=123456
#密鑰庫類型
server.ssl.keyStoreType=PKCS12
#使用的證書(密鑰對)別名
server.ssl.keyAlias=server

如果之前創(chuàng)建密鑰對的時候,沒有把 密鑰對的密碼 填成和 密鑰庫密碼 一致的,那就需要加一行

#密鑰對密碼
server.ssl.key-password=<要使用的密鑰對的密碼>

最后配成這樣子,SpringBoot能夠啟動成功,應該就可以了


image.png

當然,此時直接訪問 localhost ,肯定會報 SSL 錯誤,這是因為 server 的上級證書不被我們的瀏覽器信任。所以我們可以把之前導出的 ca.cer 安裝到 受信任的根證書頒發(fā)機構(這個位置不能選錯,否則系統(tǒng)不會認為這是根證書)


image.png

之后打開瀏覽器,訪問 localhost
image.png

這個 SSL 的 demo 就傳到 gitee 上面吧

https://gitee.com/itlove520/ssl_demo

后記

  • 為什么不用 keytool 命令行工具?
    之前筆者也試過用 keytool,在參照了大量博客的情況下,也成功了。但是 keytool 的命令行環(huán)境經(jīng)常需要寫一堆參數(shù),用起來的體驗也不是特別好,于是在了解到 KeyStore Explorer 的存在后,我立刻被它圈粉了。不過不知道是不是筆記本設置了全局縮放的原因,這個工具的在我的電腦開著中文輸入法的時候會不時抽風,但相比于敲一堆又臭又長的命令,我可能更喜歡這個 GUI 界面。

  • p12 和 cer 的區(qū)別?
    僅個人見解,不一定準確
    p12 是一個包含了公私鑰對的文件,而 cer 只包含了公鑰證書

  • 2021年,證書里面的 SAN 信息有多重要?
    2022-06-02 補充:其實把證書的 CN (Common Name) 字段填寫正確應該也能避免 NET::ERR_CERT_COMMON_NAME_INVALID 這個問題,具體請參考 https://www.cnblogs.com/iiiiher/p/8085698.html 中的 “瀏覽器如何驗證證書” 部分
    如果使用了上面的 demo,不妨試試把配置文件中的證書別名改成 ca (server.ssl.keyAlias=ca),即使是 ca.cer 那個根證書已經(jīng)加入系統(tǒng)根證書域的情況下,使用 Edge 96.0.1054.43 (當然,Chromium 內(nèi)核的) 訪問 localhost,依然會報 NET::ERR_CERT_COMMON_NAME_INVALID

    image.png

    這和 ca 證書不受信任的 NET::ERR_CERT_AUTHORITY_INVALID 報錯是不同的。說明即使證書受信任,但如果 SAN 信息對不上的話,依然會報錯??梢娔壳白C書中 SAN 信息的重要性

參考

https://blog.csdn.net/halberd6/article/details/120252041

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容