🌐

GolangでmTLS対応のHTTPSクライアント

2024/02/28に公開

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.ConfigRootCAフィールドにルート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