在使用 Golang 進行 HTTPS 請求時,需要安裝 SSL 憑證。否則,會出現類似如下的錯誤:
x509: certificate signed by unknown authority
在 Golang 中,使用了標準庫中的 net/http 套件來進行 HTTP(S) 請求。而這個套件的預設行為是要驗證伺服器的憑證。如果伺服器的憑證不在 Golang 內建的可信任憑證清單中,Golang 就會報上述錯誤。
為了解決這個問題,我們需要安裝伺服器憑證。
使用 openssl 指令從遠端伺服器下載證書,如下:
openssl s_client -connect example.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > example.com.crt
其中,example.com 為需要下載憑證的網域名稱。這個指令會從 example.com 的 443 連接埠下載證書,並儲存為 example.com.crt 檔案。
將下載好的憑證加入Golang 的可信任證書清單中,有兩種方法:
將憑證加入系統憑證庫中,讓Golang 自動辨識。
以Ubuntu 為例,將憑證複製到系統CA 儲存位置下:
sudo cp example.com.crt /usr/local/share/ca-certificates/
然後更新憑證:
sudo update-ca-certificates
將憑證新增至Golang 內建憑證庫的根憑證池中,可以透過以下方式實現。
package main import ( "crypto/tls" "crypto/x509" "io/ioutil" "fmt" "net/http" ) func main() { // 从文件载入证书 cert, err := ioutil.ReadFile("example.com.crt") if err != nil { fmt.Println(err) return } pool := x509.NewCertPool() // 将证书添加到根证书池中 if ok := pool.AppendCertsFromPEM(cert); !ok { fmt.Println("Failed to parse root certificate") return } tr := &http.Transport{ TLSClientConfig: &tls.Config{ RootCAs: pool, }, } client := &http.Client{Transport: tr} _, err = client.Get("https://example.com") if err != nil { fmt.Println(err) return } fmt.Println("Success") }
該程式會載入 example.com.crt 檔案並將其新增至根憑證池中。然後使用這個憑證來造訪 example.com 網站。如果載入憑證成功,則會輸出 "Success"。
執行下列程式碼:
package main import ( "crypto/tls" "fmt" "net/http" ) func main() { resp, err := http.Get("https://example.com") if err != nil { fmt.Println(err) return } defer resp.Body.Close() fmt.Println(resp.Status) }
如果傳回狀態碼為 200,則表示憑證已經安裝成功。否則,可能還需要檢查證書或網路等其他問題。
以上就是在 Golang 中安裝 SSL 憑證的方法。在實際工作中,使用方式一較常見,因為一般都會有系統管理員負責維護系統憑證庫。而方式二則適用於一些特殊情況。
以上是golang 安裝證書的詳細內容。更多資訊請關注PHP中文網其他相關文章!