🌐
GolangでmTLS対応のHTTPSクライアント
Goのバージョンは1.22。
mTLS対応のHTTPSクライアント
mTLSクライアントに必要なもの
- クライアント秘密鍵&クライアント証明書
- サーバ証明書の検証に使うルートCA証明書(システムにインストールされている場合は不要)
クライアント証明書だけ設定する場合
// クライアント証明書とクライアント秘密鍵(いずれもPEM形式)を読み込んでx509.KeyPairを作る
clientKeyPair, err := tls.LoadX509KeyPair("client.crt", "client.key")
if err != nil {
log.Fatalln(err)
}
// HTTPSクライアント
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{clientKeyPair},
},
ForceAttemptHTTP2: true, // HTTP/2を有効にしたい場合はtrueにする
}
}
ルートCA証明書も設定する場合
サーバ証明書の検証に使うルートCA証明書がシステムにインストールされていない場合、
tls.Config
のRootCA
フィールドにルートCA証明書を与える必要がある。
// クライアント証明書とクライアント秘密鍵(いずれもPEM形式)を読み込んでx509.KeyPairを作る
clientKeyPair, err := tls.LoadX509KeyPair("client.crt", "client.key")
if err != nil {
log.Fatalln(err)
}
// ルートCA証明書(PEM形式)を読み込む
caCertBytes, err := os.ReadFile("ca.crt")
if err != nil {
log.Fatalln(err)
}
// ルートCA証明書をx509.CertPoolに入れる
rootCA := x509.NewCertPool()
if ok := rootCA.AppendCertsFromPEM(caCertBytes); !ok {
log.Fatalln("failed to parse certificate")
}
// mTLS対応のHTTPSクライアント
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{clientKeyPair},
RootCA: rootCA,
},
ForceAttemptHTTP2: true, // HTTP/2を有効にしたい場合はtrueにする
}
}
Discussion