Wenn Sie Golang zum Senden von HTTPS-Anfragen verwenden, müssen Sie ein SSL-Zertifikat installieren. Andernfalls tritt ein Fehler ähnlich dem folgenden auf:
x509: certificate signed by unknown authority
In Golang wird das Paket net/http in der Standardbibliothek verwendet, um HTTP(S)-Anfragen zu stellen. Das Standardverhalten dieses Pakets besteht darin, das Zertifikat des Servers zu überprüfen. Wenn das Zertifikat des Servers nicht in der integrierten Liste der vertrauenswürdigen Zertifikate von Golang enthalten ist, meldet Golang den oben genannten Fehler.
Um dieses Problem zu lösen, müssen wir das Serverzertifikat installieren.
Verwenden Sie den Befehl openssl, um das Zertifikat wie folgt vom Remote-Server herunterzuladen:
openssl s_client -connect example.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > example.com.crt
Unter anderem Beispiel .com ist das Zertifikat, das heruntergeladen werden muss. Dieser Befehl lädt das Zertifikat von Port 443 von example.com herunter und speichert es als example.com.crt-Datei.
Fügen Sie das heruntergeladene Zertifikat zur Liste der vertrauenswürdigen Zertifikate von Golang hinzu. Es gibt zwei Methoden:
Fügen Sie das Zertifikat zum Systemzertifikatspeicher hinzu und lassen Sie es von Golang automatisch erkennen.
Am Beispiel von Ubuntu kopieren Sie das Zertifikat in den CA-Speicherort des Systems:
sudo cp example.com.crt /usr/local/share/ca-certificates/
Aktualisieren Sie dann das Zertifikat:
sudo update-ca-certificates
Fügen Sie das Zertifikat zum Stammzertifikatspool des integrierten Zertifikatsspeichers von Golang hinzu. Dies kann auf folgende Weise erreicht werden.
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") }
Dieses Programm lädt die Datei example.com.crt und fügt sie dem Stammzertifikatspool hinzu. Dieses Zertifikat wird dann für den Zugriff auf die Website example.com verwendet. Wenn das Zertifikat erfolgreich geladen wurde, wird „Success“ ausgegeben.
Führen Sie den folgenden Code aus:
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) }
Wenn der Rückgabestatuscode 200 ist, bedeutet dies, dass Das Zertifikat wurde erfolgreich installiert. Andernfalls müssen möglicherweise andere Probleme wie Zertifikate oder Netzwerk überprüft werden.
Oben erfahren Sie, wie Sie ein SSL-Zertifikat in Golang installieren. In der Praxis ist Methode 1 häufiger anzutreffen, da in der Regel ein Systemadministrator für die Pflege der Systemzertifikatsdatenbank verantwortlich ist. Die zweite Methode eignet sich für einige Sondersituationen.
Das obige ist der detaillierte Inhalt vonGolang-Installationszertifikat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!