投稿

その HTTPS は本当に ACM 証明書を使っているのか

その HTTPS は本当に ACM 証明書を使っているのか

社内ツールの証明書が切れていると連絡が来た。ACM を開くと同じドメインのワイルドカード証明書はあるが、期限は数か月先で切れていない。ACM の証明書は ALB / NLB / CloudFront / API Gateway にアタッチして使うもので、EC2 の中の Web サーバには渡らない。EIP を直づけしたホストなら、そもそも ACM が経路に出てこない。

「使っていない」は次の3つで確かめられる。

1. DNS レコードがエイリアスかどうか

aws route53 list-resource-record-sets --hosted-zone-id Z0000000000000 \
  --query "ResourceRecordSets[?starts_with(Name, 'example')]"
{
  "Name": "example.test.com.",
  "Type": "A",
  "TTL": 300,
  "ResourceRecords": [ { "Value": "203.0.113.10" } ]
}

ALB や CloudFront を経由するなら AliasTarget を持ち、TTL は付かない。リテラル IP の A レコードなら、マネージドな TLS 終端層を通っていない。

2. その IP の持ち主

aws ec2 describe-addresses --filters "Name=public-ip,Values=203.0.113.10" \
  --query 'Addresses[].[PublicIp,InstanceId,NetworkInterfaceId]' --output text

EIP がインスタンスの ENI に直結していれば、TLS ハンドシェイクの相手はその EC2 自身。証明書を出す主体が AWS 側にいない。

3. ACM 全件の InUseBy

for arn in $(aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn' --output text); do
  aws acm describe-certificate --certificate-arn "$arn" \
    --query 'Certificate.[DomainName,Status,join(`,`,InUseBy)]' --output text
done

CloudFront 用は us-east-1 にあるので両リージョンで回す。InUseBy が全部 ALB / NLB / CloudFront なら、EC2 に渡っているものは1枚も無い。

秘密鍵を持ち出す抜け道

aws acm describe-certificate --certificate-arn <arn> \
  --query 'Certificate.Options.Export'
# "DISABLED"

これなら鍵を取り出せないので、ファイルをコピーして EC2 に置く手も使えない。2025 年に追加されたエクスポート可能な公開証明書は、発行時の指定と課金が要る。古い証明書は該当しない。

ここまでで確定するのは「AWS 側の証明書機能が経路に登場しない」まで。中で何が TLS を終端しているかは、インスタンスに入るまで分からない。

トレンドのタグ