1. 程式人生 > 其它 >記一次curl請求https證書過期問題

記一次curl請求https證書過期問題

事情源於一次專案呼叫第三方介面,協議是https。在國慶前都是好好的,突然假期最後一天領導說訪問不了網頁了,忙去檢視下日誌,發現報證書過期,第一反應是介面提供方的域名證書過期了,但是後來本地呼叫又發現正常,後經過以下排查發現並解決了問題

事情源於一次專案呼叫第三方介面,協議是https。在國慶前都是好好的,突然假期最後一天領導說訪問不了網頁了,忙去檢視下日誌,發現報證書過期,第一反應是介面提供方的域名證書過期了,但是後來本地呼叫又發現正常,後經過以下排查發現並解決了問題

問題

專案是用php開發的,由於php的guzzle工具是依賴於伺服器的curl,所以curl模擬一波,果然重現了問題

請求
curl -H "Content-Type:application/json" -X POST --data '{"param1":1}' https://openapi.xxx.cn/api/getData

報錯
curl: (60) SSL certificate problem: certificate has expired

解決方案

很明顯,提示證書過期時,由於已經本地測試過幾乎可以排除對方證書過期的問題,那麼很明顯是伺服器環境的問題

方案一
關閉對證書的驗證【-k】,雖然馬上就不報錯了,但是這種方式只是應急的,生產環境並不可取

curl -H "Content-Type:application/json" -X POST   --data '{"param1":1}'  https://openapi.xxx.cn/api/getData -k

{"data":null,"resultCode":-102,"resultMsg":"該請求已過期"}

方案二
基本可以確定是伺服器本地的證書過舊,需要下載最新的【http://curl.haxx.se/ca/cacert.pem

】,以下提供本地mac環境和伺服器centos環境下的解決過程

mac

curl-config --ca  //嘗試獲取證書位置,但是我這邊返回了空,問題不大,繼續curl -v看下具體資訊
curl http://xxx -v //檢視報錯原因,得知mac下讀取的證書檔案位置是在[/etc/ssl/cert.pem ]
ls  -l /etc/ssl/cert.pem
-rw-r--r-- 1  /etc/ssl/cert.pem  //這裡直接是個檔案,許可權是644
cp /etc/ssl/cert.pem /etc/ssl/cert.bak.pem //備份原檔案
curl -o ./cacert.pem "http://curl.haxx.se/ca/cacert.pem"  -L -v //下載最新的證書。-L是為了跟蹤重定向,-v是為了檢視具體資訊
cp ./cacert.pem /etc/ssl/cert.pem  //替換原檔案,到此完成

centos

curl-config --ca  //嘗試獲取證書位置,得知centos下讀取的證書檔案位置是在[/etc/pki/tls/certs/ca-bundle.crt]
ll /etc/pki/tls/certs/ca-bundle.crt
lrwxrwxrwx 1 root root /etc/pki/tls/certs/ca-bundle.crt -> /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem //這裡是個軟連線,許可權是777
mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.bak.crt  //備份原檔案
curl -o ./cacert.pem "http://curl.haxx.se/ca/cacert.pem"  -L -v //下載最新的證書。-L是為了跟蹤重定向,-v是為了檢視具體資訊
cp ~/cacert.pem /etc/pki/ca-trust/extracted/pem/20211008-ca-bundle.pem //先存放到這個目錄下
ln -s  /etc/pki/ca-trust/extracted/pem/20211008-ca-bundle.pem /etc/pki/tls/certs/ca-bundle.crt //和原檔案一樣,建立軟連線,到此完成