今回はUniProのK8sとCloudflareを連携させて、DNS経由でLet's Encryptから証明書を取ってくる話です。
Cloudflareへの登録等に関しては、以下の記事で取り扱っているので、よければご覧ください。
動機
HTTPでCert-managerを使用すると、.well-knownのディレクトリがNextJSの404ページになってしまい、非常にめんどくさかったんですよね...
なので、DNS経由でのACMEを用いれば幸せになれるなぁと思ってやってみました。
仕組み
ACMEの認証フローはこんな感じです。
- CertmanagerがLet's Encryptからトークンをもらってくる
- CertmanagerがCloudflareのAPIを叩いてDNSレコードを作成する
- Let's EncryptのDNS-01のACME認証を通す
- 証明書を受け取り次第、CloudflareのAPIを叩いてDNSレコードを削除する
要はCloudflareのAPIを叩くための設定さえやっとけば大体はOKですね。
では、やってみましょう。
Issuerをたてる
ClusterIssuerにDNS01で使う設定を色々していきます。
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: le-cf-staging
spec:
acme:
email: webmaster@mail.uniproject-tech.net
privateKeySecretRef:
name: uniproject-tech-cluster-issuer-secret
server: https://acme-staging-v02.api.letsencrypt.org/directory
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
解説
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: le-cf-staging
spec:
acme:
email: webmaster@mail.uniproject-tech.net
privateKeySecretRef:
name: uniproject-tech-cluster-issuer-secret
server: https://acme-staging-v02.api.letsencrypt.org/directory
ここまではいつも通りですね。
solvers:
- dns01:
cloudflare:
apiTokenSecretRef:
name: cloudflare-api-token-secret
key: api-token
ここでCloudflareのAPIを叩くための認証情報があるSecretを指定しています。
この場合だと、cloudflare-api-token-secretのapi-tokenから持ってきていますね。
ちなみに、Cert-managerはCloudflare以外にもいろんなDNSプロバイダーをサポートしています。
- ACMEDNS
- Akamai
- AzureDNS
- CloudFlare
- Route53
- DigitalOcean
- RFC2136
Secretを作る
これを、ClusterIssuerと同じnamespaceに置きましょう。
apiVersion: v1
data:
api-token: <base64 encoded API token>
kind: Secret
metadata:
name: cloudflare-api-token-secret
解説
APIトークンはCloudflareのダッシュボードから持ってきます。
ここで、作成、テンプレからDNSを選ぶと、とても便利です。
今回はアカウント全体にしました。
あとは、セットして使ってみるだけです。
まとめ
今回はDNS-01でACMEを使い、Cert-managerでSSL証明書を取ってくるまでをしました。
だいぶ便利なので、皆さんもやってみてください!!
参考文献