這是公司同事所遇到的問題。簡單來說,就是有一支程序會使用到證書,證書即將到期,所以就在定期維護時換上新的的證書。但一天之後,其他部份反應問題,才發現程序沒有啟動或說一直無法正常啟動。
根據程序 LOG 顯示,開發也表示無法正常啟動的原因是和證書有關係,所以同事們就開始一連串的問題尋找。
同事們原先以為是因為沒有把證書成功替換,換言之就是沒有使用新的證書。所以他們就先簡單判斷證書的有效期,是新的還是舊的。像這樣:
# 將 <certificate file name> 取代為真實證書檔名 openssl x509 -noout -dates -in <certificate file name> # 結果會像這樣 notBefore=Apr 7 07:46:45 2023 GMT notAfter=Jul 6 07:46:44 2023 GMT
從日期結果來看,證書確實有更換成新的,因為證書有效期是一年期,所以 notAfter 的年份的確是 2024 年,而 notBefore 也的確是買證書那天的日期。
因為這部份的工作和處理,並不在我的工作責任範圍內,所以我也沒法介入太多,後續也沒特別再追蹤下去。
幾小時之後,同事突然發現到了一個問題,就是證書的私鑰檔,內容多了一個英文的小寫 i。大家為此感到詫異不已,只能合理懷疑是在 vi 裡使用複製貼上的方式進行更新證書造成。
這同時也勾起了我的記憶,以前因為還不很熟悉證書的東西,所以在配置證書時常會有一些問題,其中曾遇過的問題就是證書和私鑰檔,因為不相符而造成問題,這也和這次同事問題一致。
最後我則是建議同事可以利用 openssl 再做進一步的證書和私鑰的驗證,這樣可以降低日後再發生類似情況,或因為要處理的證書很多或弄混了相關檔案。
證書本身,先用下列指令得出 SHA-1
# 將 <certificate file name> 取代為真實證書檔名 openssl x509 -noout -modulus -in <certificate file name> | openssl sha1 # 結果會像這樣 (stdin)= eabf908be8908d4146247b331a460a6eb0727956
私鑰的部份,則利用下列指令得出 SHA-1
# 將 <private key> 取代為真實私鑰檔名 openssl rsa -noout -modulus -in <private file> | openssl sha1 # 結果會像是這樣 (stdin)= eabf908be8908d4146247b331a460a6eb0727956
我們可以看證書和私鑰,經過操作之後,其 SHA-1 結果完全一致。也因此可以說明這證書和私鑰檔在使用上是不會有問題。有些證書供應商,也可能會提供一張更完整包含 CA 的 fullchain 證書,在算 SHA-1 時也可以指定那一張,它的結果也會和私鑰一致。
單純使用日期只能判斷證書本身有沒有過期,或者與我們要使用的域名是否一致(SAN 暫時忽略)。像下面我用我網站證書說明,我在同一天,先後申請了兩張證書
# 第一份證書 openssl x509 -noout -in wawajohn.net.ok1/wawajohn.net.cer -subject -dates subject= /CN=wawajohn.net notBefore=Apr 16 06:14:48 2023 GMT notAfter=Jul 15 06:14:47 2023 GMT # 第二份證書 openssl x509 -noout -in wawajohn.net/wawajohn.net.cer -subject -dates subject= /CN=wawajohn.net notBefore=Apr 16 06:16:29 2023 GMT notAfter=Jul 15 06:16:28 2023 GMT
從以上例子可以看兩份證書,都是給相同域名使用,兩者的時間也僅僅差了 2 分鐘左右,但這結果也只能判定效期,以及證書可用在哪些域名上。
如果我們把第一份證書的私鑰,和第二份證書,各算其 SHA-1,會發現它們是不一樣的
# 第一份證書的私鑰 openssl rsa -noout -modulus -in wawajohn.net.ok1/wawajohn.net.key | openssl sha1 (stdin)= cfc38c2d59b41b631d79b92f74f35b8d3175c99c # 第二份證書 openssl x509 -noout -modulus -in wawajohn.net/wawajohn.net.cer | openssl sha1 (stdin)= eabf908be8908d4146247b331a460a6eb0727956
由此我們可以更確定,如果要驗證證書的,必須要證書與私鑰做相同的 HASH 計算並做比較,如此才能得出其正確性。如此一來,在正式運作環境的使用,不會因為檔名一樣或是其他因素混淆了檔案問的差異,而誤用它們進而產生未預期的錯誤。