やりたいこと
このワイルドカード証明書発行は自動発行ではありません。また、ローカル証明書としても保存したいので結構やることがあります。
現時点での運用案
![](https://manualmaton.com/wp-content/uploads/2022/12/image-3-1024x480.png)
redmineのチケットテンプレートとすることで、手順をチケットに流し込むことにしました。
一度作ってしまえば後は新規チケットとして発行し、それに沿って行けば抜け漏れがありません。(redmineのリマインド機能も利用します)
また、テンプレートそのものを直すことで後の手順変更にも対応可能です。
設定したテンプレート
- ドメインはsample.domainとしています。
- 実施時期はLet's Encryptの更新サイクルに合わせています。
- 作成年月を後で修正することがないように変数化しています。
- apacheとnginxの設定ファイルの証明書/秘密鍵参照先はそれぞれシンボリックリンク先なので、リンクを貼り替えるだけで証明書が更新できるようにしています。
### 概要
Let's EncryptのSSLワイルドカード証明書を発行して更新する。
### 実施時期
毎年
- 3月
- 6月
- 9月
- 12月
### 実施手順 (AWS Lightsailサーバ)
#### 作業ディレクトリ作成
```bash
mkdir -p /home/work/ssl$(date +%Y%m)
cd /home/work/ssl$(date +%Y%m)
```
#### 証明書発行
```bash
sudo certbot certonly --manual \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory \
-m メールアドレス \
-d *.sample.domain
```
1. コマンド発行後、TXTレコードの登録指示がある。
1. AWS管理コンソールにログインする
1. 指示があったTXTレコードを登録
1. 以下のコマンドで結果が返ってくるまでしばらく待つ
```bash
nslookup -type=TXT _acme-challenge.sample.domain
```
→ 結果が返ってきたらEnter。証明書が更新される。
#### 証明書を作業ディレクトリにコピー
```bash
sudo cp -pi /etc/letsencrypt/live/sample.domain-0001/fullchain.pem ./sample.domain.crt.$(date +%Y%m)
sudo cp -pi /etc/letsencrypt/live/sample.domain-0001/privkey.pem ./sample.domain.key.$(date +%Y%m)
```
#### 証明書の整合性を確認
```bash
openssl x509 -noout -dates -subject -in sample.domain.crt.$(date +%Y%m)
# 期限が延びていることを確認
openssl x509 -in sample.domain.crt.$(date +%Y%m) -noout -modulus | md5sum
openssl rsa -in sample.domain.key.$(date +%Y%m) -noout -modulus | md5sum
# 証明書-秘密鍵のハッシュ値が同じであることを確認
openssl x509 -issuer_hash -noout -in sample.domain.crt.$(date +%Y%m)
sed -n -e'1d' -e'/BEGIN/,$p' sample.domain.crt.$(date +%Y%m) | openssl x509 -subject_hash -noout
# 証明書-中間証明書の発行元のハッシュ値が同じであることを確認
```
### 実施手順 (apache/nginxサーバ)
#### 証明書を格納する(nginx/apache共通)
ここからは管理者権限で実施する。
```
cd /etc/certs/
# 証明書ファイルを格納したディレクトリに移動します
vi sample.domain.crt.$(date +%Y%m)
# AWSサーバで発行した証明書を貼り付けます
ls -l
# *以下を確認します*
# 更新したLet's Encyrptの証明書ファイルがあること
# 証明書のシンボリックリンクの向き先が前回更新年月であること
ln -sf sample.domain.crt.$(date +%Y%m) sample.domain.crt
ls -l
# *以下を確認します*
# 証明書のシンボリックリンクの向き先が*今回*更新年月であること
```
#### 秘密鍵を格納する(nginx/aapche共通)
```bash
cd /etc/private
# SSL秘密鍵を格納したディレクトリに移動します
vi sample.domain.key.$(date +%Y%m)
# AWSサーバで発行した秘密鍵を貼り付けます
ls -l
# *以下を確認します*
# 更新したLet's Encyrptの秘密鍵ファイルがあること
# 証明書の秘密鍵の向き先が前回更新年月であること
ln -sf sample.domain.key.$(date +%Y%m) sample.domain.key
ls -l
# *以下を確認します*
# 証明書の秘密鍵の向き先が*今回*更新年月であること
```
#### 設定反映
##### nginxの場合
```bash
nginx -t
# syntax is okを確認
systemctl restart nginx
systemctl status nginx
# 再起動後、正常に稼働していることを確認
```
##### apacheの場合
```bash
apache2ctl configtest
# Syntax okを確認
systemctl restart apache2
systemctl status apache2
# 再起動後、正常に稼働していることを確認
```
#### 反映確認
ブラウザで証明書が延びていることを確認
マイハイ
ここまで整理できていると、ansibleで回すともっといい感じになるかもしれません。
https://docs.ansible.com/ansible/2.5/modules/letsencrypt_module.html
https://zaki-hmkc.hatenablog.com/entry/2021/01/18/074047
manualmaton
コメントありがとうございます。
また、お褒めに与り光栄です。
ansibleによる運用は考えていたので、現在のプロジェクトでも試してみます。