Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Jan 24, 2021 - コメント - 日記

traefikでLetsEncryptのワイルドカードSSLサーバ証明書を使う

以前書いたtraefik 関連記事、1つのサーバにたくさんのWebサービスを詰め込む方法 にてwhoami.example.comのサービスを作成しましたが、とある理由でwhoami.example.comをサブドメインとするホストすべてからアクセスできるようにしたい、つまりa.whoami.example.comb.whoami.example.comなどを使いたいときにどうすればよいかを説明します。

以前書いたものを修正します、ハイライト箇所が修正されています。

docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
version: '3'
networks:
  default:
    external:
      name: front

services:
  whoami:
    image: containous/whoami
    labels:
      - "traefik.http.routers.whoami_example.rule=HostRegex(`{subdomain:[a-z]+}.whoami.example.com`)"
      - "traefik.http.routers.whoami_example.tls=true"
      - "traefik.http.routers.whoami_example.tls.certresolver=dnsresolver"
      - "traefik.http.routers.whoami_example.tls.domains[0].main=*.example.com"

{subdomain:[a-z]+}.example.comってなに?って思われるかもしれませんが、これはtraefik内部で使われているgorilla mux router の記法です。普通に[a-z]+.example.comと書いても動きそうですが、このまま掲載します。

複数のパターンに対応

ちょっとまった!これでは、以前アクセスできていたwhoami.example.comでアクセスできなくなっていましました。ルーティングルールにwhoami.example.comを追加します。

1
2
3
4
5
      - "traefik.http.routers.whoami_example.rule=Host(`whoami.example.com`) || HostRegex(`{subdomain:[a-z]+}.whoami.example.com`)"
      - "traefik.http.routers.whoami_example.tls=true"
      - "traefik.http.routers.whoami_example.tls.certresolver=dnsresolver"
      - "traefik.http.routers.whoami_example.tls.domains[0].main=whoami.example.com"
      - "traefik.http.routers.whoami_example.tls.domains[0].sans=*.example.com"

このsansとは、SANs(Subject Alternate Names)の略で、サーバ証明書のCN(Common Name)の別名のことです。


そういえば、2018年にLet’s Encryptがワイルドカードドメインに対応した というのは個人的には大ニュースでした、未だ記憶に新しいですね。