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 の信頼できる証明書リストに追加します。方法は 2 つあります:
証明書をシステム証明書ストアに追加し、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 Web サイトにアクセスするために使用されます。証明書の読み込みに成功すると「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証明書をインストールする方法です。実際の作業では、通常、システム証明書データベースの保守を担当するシステム管理者が存在するため、方法 1 の方が一般的です。 2 番目の方法は、いくつかの特殊な状況に適しています。
以上がgolang インストール証明書の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。