介紹如何解決 git
透過 HTTPS 加密連線時所產生的憑證驗證失敗問題。
若使用 git
指令透過 https
的方式連線至 git 伺服器進行各種操作時,出現類似以下的連線錯誤:
fatal: unable to access 'https://your.host.com/team/proj.git/': server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
代表自己的電腦不信任簽屬 git 伺服器憑證的憑證頒發機構,有可能該憑證是自行簽署的,或是由其他沒有在 OS 內建名單中的機構所簽署。
git
忽略 SSL 憑證檢查解決這個問題的方法就是告訴自己的系統信任該憑證(如果它看起來沒有異常),若是在命令列中,可以先設定 GIT_SSL_NO_VERIFY
這個環境變數,這樣就可以讓 git
忽略憑證的驗證:
# 讓 Git Client 忽略 SSL 憑證檢查 export GIT_SSL_NO_VERIFY=1
設定了 GIT_SSL_NO_VERIFY
之後,在執行任何 git
指令時,就不會再進行任何 SSL 憑證檢查,也就可以避免出現上面這個憑證不被信任的問題了。
若要讓 git
永久忽略 SSL 憑證檢查,可以直接將設定寫入 git
的設定檔:
# 設定讓 Git Client 永久忽略 SSL 憑證檢查 git config --global http.sslverify false
git
伺服器憑證雖然讓 git
忽略 SSL 憑證檢查可以快速解決憑證不被信任的問題,但是這樣就會讓 SSL 連線少了一層防護措施,並不是根本的解決方式,標準的作法應該是匯入 git
伺服器憑證,讓 git
可以信任該憑證,以下是匯入憑證的指令稿:
# Git 伺服器資訊 hostname=your.git.com port=443 # 取得自己 OS 中放置 CA 的位置 trust_cert_file_location=`curl-config --ca` # 匯入 Git 伺服器憑證 sudo bash -c "echo -n | openssl s_client -showcerts -connect $hostname:$port \ 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' \ >> $trust_cert_file_location"
這段指令稿在使用之前必須先把 hostname
更換成自己的 git
伺服器,執行之後他就會把該台 git
伺服器的 SSL 憑證匯入自己 OS 的信任憑證清單之中,日後在使用 git
指令時就永遠不會遇到 SSL 憑證不被信任的問題了。
參考資料:StackOverflow、暗黑執行緒