close

自從大量web server採用Let's Encrypt以後
如果你的Linux系統太舊沒有安裝相應的root certificate
你的 web client就會因為安全因素,拒絕承認(怕中間人攻擊)
wget會噴出 Unable to locally verify the issuer's authority.

我的wget版本很奇怪,不會去讀取這個檔案
/etc/ssl/certs/ca-certificates.crt
所以就算裝了最新的
https://curl.haxx.se/ca/cacert.pem
也沒有用.
網路上看到有些人更新 ca-certificates 套件也沒用.
看了套件內容,憑證安裝的位置是 /usr/share/ca-certificates/mozilla/
而/etc/ssl/certs/底下的PEM檔案幾乎都是soft link到這邊來.


於是直接把wget餵給strace來觀察runtime呼叫了哪些system call
然後stat,open了哪些檔案.(先不衝動 trace code :)
strace wget https://community.letsencrypt.org/ &> strace_wget.txt
最後在socket,connect,write這些關鍵syscall附近找到了問題點.
當wget讀取了web server給的ca憑證後要比對時
它stat了/usr/lib/ssl/certs/4042bcee.0
以及/usr/lib/ssl/certs/8d33f237.0
賞試get file status都沒有找到該檔案.
當第1個讀取失敗就賞試讀第2個
於是用chrome把這個網站的 ISRG Root X1 PEM證書export
存成4042bcee.0然後放上去就解決了.

這位置是一個soft link
/usr/lib/ssl/certs -> /etc/ssl/certs

另外如果是遇到
Issued certificate has expired.
憑證過期的問題
我是升級 ca-certificates 套件就解決了
apt update && apt install ca-certificates


最後還是好奇去翻了一下 wget ssl 
( 位於 wget/src/openssl.c 的 SSL_get_verify_result() )
它是把證書驗證手續丟給openssl lib的
SSL_get_verify_result API去處理的

全站熱搜
創作者介紹
創作者 fvalinux 的頭像
fvalinux

Elegance

fvalinux 發表在 痞客邦 留言(0) 人氣()