需要生成一個 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

格式默認選擇 pkcs #12 就行

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

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

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

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

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

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

然后填寫別名

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

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

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

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

目前得到的文件如下:

4. 創(chuàng)建并簽發(fā)二級證書
如果是用過命令行工具的朋友應該知道簽發(fā)二級證書的過程應該是 生成 key pair -> 生成 csr 請求 -> 簽發(fā)并生成 cer 證書
不過 KeyStore Explorer 工具提供了一個便捷的方式,直接在 ca 密鑰對上右鍵 -> Sign -> Sign New Key Pair 即可從生成密鑰對到簽發(fā)一氣呵成

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

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

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

模板選擇 SSL Server

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

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

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

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

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

之后也會填寫密碼,為了方便可填為和 KeyStore 一致的,此處就不貼圖了
現(xiàn)在得到了兩個密鑰對,server 就是帶有 SAN 信息的服務端密鑰對了,別忘了 Ctrl + S 保存一下

此時,我們可以像導出 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能夠啟動成功,應該就可以了

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

之后打開瀏覽器,訪問 localhost

這個 SSL 的 demo 就傳到 gitee 上面吧
后記
為什么不用 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 信息的重要性

