インフラストラクチャ 2026-06-11 ⏱ 約 6 分

内部LBのHTTPS化でマネージド証明書を使うなら、ドメインは公開DNSに置く必要がある

VPC内部通信をHTTPS化する際、Cloud DNSのprivate zoneではマネージド証明書が使えない理由と、公開ドメイン+private IPという落とし所について整理する。

Read in: en
内部LBのHTTPS化でマネージド証明書を使うなら、ドメインは公開DNSに置く必要がある

VPC内部の通信(あるアプリから別アプリの内部APIへの呼び出し)をHTTPS化する構成を考えていて、ふと「証明書のドメインはCloud DNSで払い出されるprivateなドメインでもよかったのではないか」と思ったので、整理しておく。

結論を先に書くと、マネージド証明書(公的に信頼される証明書)を使いたいなら、ドメインは公開DNSに置く必要がある。private zoneのドメインではマネージド証明書は発行できない。

前提となる構成

DNSには2つの役割がある

この構成でDNSが担う役割は、実は2つに分かれている。

役割 内容
(A) 証明書のドメイン検証 Certificate ManagerのDNS Authorization(_acme-challengeのCNAME)とCAA
(B) 名前解決 LBのVIPを引くためのAレコード

「Cloud DNSのprivate zoneでよかったのでは」という疑問は、主に(B)の話。(B)だけならprivate zoneでも成立する。

(A) マネージド証明書の検証は公開DNS必須

ここが肝。マネージド証明書(=公的CAが署名する証明書)を発行するとき、GoogleのCAはインターネットの公開DNSから _acme-challenge のレコードを引いてドメイン所有を検証する。

private zoneはVPC内部からしか引けないので、外部のCAからは見えない。つまりprivate zoneのドメインに対してはマネージド証明書を発行できない

ゾーン種別 外部のCAから引けるか マネージド証明書
公開ゾーン(public) 引ける 使える
private zone(VPC内のみ) 引けない 使えない

private zoneでHTTPSをやる場合

どうしてもprivate zone(VPC内専用ドメイン)でHTTPSをやるなら、選択肢は変わる。

採用した落とし所:公開ドメイン+private IP

今回は、private zoneを使わずに次の形にした。

「公開DNSにprivate IPのAレコードを置く」のは一見奇妙だが、ドメインが公開なので検証(A)と名前解決(B)を同じ公開ゾーンに集約でき、証明書はマネージドのまま使える。実際の到達はVPC Peering経由なので、IPが公開DNSに見えても外部から到達できるわけではない。

flowchart LR subgraph public["公開DNS(公開ゾーン)"] cname["CNAME: _acme-challenge<br/>(証明書のドメイン検証)"] a["A: internal.example.com -> 10.x.x.x<br/>(private IPを返す)"] end ca["公的CA"] -->|"公開DNSで所有検証"| cert["マネージド証明書"] cname --> ca caller["呼び出し元(別VPC)"] -->|"名前解決"| a a -->|"VPC Peering経由で到達"| lb["内部LB(VIP)"] cert -->|"HTTPS成立"| lb

一般的にはどうしているか

内部通信のTLSは定番の悩みで、規模に応じてだいたい次のどれかに落ち着く。

まとめ

「privateなドメインならマネージド証明書が使えないのではないか」という直感は正しくて、証明書を公的なものにする以上、検証は必ず公開DNSを通る、というのが要点だった。

Tags: Google Cloud Platform Certificate Manager DNS
Share: 𝕏 Post Facebook Hatena
✏️ View source / Discuss on GitHub
☕ サポート

このブログを応援していただける方は、以下からサポートをお願いします。いただいたサポートはブログ運営・技術研鑽に活用します。


関連記事