Let's Encryptで証明書を作るときワイルドカード証明書を作りたい場合DNSによるドメイン証明をする必要があるので、自動化するためのワークフロー作ってみました
作ったものはこちらに
https://github.com/miyuk/ansible_cert_update
作った理由
うちの自宅にあるWebアプリケーションあるけど直接通信したくないから、DMZにLB入れていて運用していたんですが複数のLB作ることになったので証明書をまとめたい
ってのと複数のLBに同時に最新の証明書入れたい
て思ったんで解決してみました。
使用ツール
- Ansible AWX
- ワイルドカード証明書が使えるリバースプロキシ(BIG-IP, Nginx, HAProxy)
workflow_cert_update
週一回ワークフローを動かすことで、証明書更新している。
ワークフローは下記の3フェーズに分かれている。
job_update_cert
AWX上で、Let's Encryptを更新する。更新したファイルはAWX上に保管し次回実行でも利用する。
内容としては、
- Let's Encryptの証明書検証で利用する鍵、アカウントなどを用意
- Let's Encryptチャレンジリクエスト
- リクエストで取得したトークンをDNSにセット。今回、Cloudflare APIを使ってDNSの動的アップデートを行っている
- Let's Encrypt証明書要求
- 成功すれば、証明書をプロジェクトフォルダに保管
job_deploy_xxxx
各LB毎に証明書ファイルをアップロードしてデプロイする。
今回、BIG-IP、Nginx、HAProxyで証明書更新(サービス再起動)できるようにしている。
また、自宅環境がDockerによって構成されているので、Nginx、HAProxyはDockerで更新をすることもできるようにしている。
job_cert_update_report
証明書更新が実際にできたかどうかを通知する。
AWXの通知でも良かったが、どこまで完了しているかは把握したかったので作成。
おわりに
この方法だと、複数の拠点にあるリバースプロキシあてでも証明書を更新することができるのでテスト環境で信頼できる証明書を色んなサーバに入れておきたいというニーズでも答えれるのかなと思います。
通知部分やAWX内での証明書の持ち方については、もう少し考察必要できればいいなと考えてますがAnsible関わる機会が減り、なかなか手つかず。