イントロダクション#
- acme.sh:証明書の自動申請と更新のためのツール
- Cloudflare:ドメイン解析とホスティングプラットフォーム(そのうちの 1 つのサービス)
- Let’s Encrypt:無料の証明書発行機関(有効期間は 3 ヶ月)
準備#
Cloudflare トークンの申請#
ドメインの検証を行うために、ドメインの DNS 権限を編集するためのトークンを申請する必要があります:
- ユーザー API トークンでトークンを作成をクリックします。
- DNS エリアを編集をクリックして、テンプレートを使用を選択します。
- エリアリソースで証明書を申請するドメインを選択します。
- 保存します。
Synology SSH ログインの有効化#
Synology の Web にログインし、コントロールパネル -> ターミナルと SNMPに進み、SSH 機能を有効にするにチェックを入れて保存します。
注:別の方法として、Synology のタスクスケジューラを使用して各操作を実行することもできます。
証明書の申請#
以下の手順は、Synology に [[SSH]] で接続した状態で実行されます。各操作の前にexport
変数を実行する必要はありませんが、コード内に表示されているのはより直感的にするためです。
デフォルトでは、Synology のアカウントは [[Docker]] グループに参加していないため、操作を容易にするために root アカウントに切り替えます。もちろん、各コマンドに [[sudo]] 接頭辞を付けて実行することもできます。以下は root アカウントに切り替える例です:
sudo -i
次に、ドメイン証明書を保存するフォルダを作成します:
mkdir -p /volume1/docker/acme.sh
ACME アカウントの登録#
export ACMEPATH="/volume1/docker/acme.sh" # 作成したパス
export EMAIL="mail@example.com" # Let's Encryptに登録するメールアドレス
docker run --rm \
-v "${ACMEPATH}":/acme.sh \
--net=host \
neilpang/acme.sh \
--register-account \
-m "${EMAIL}" \
--server letsencrypt
- --rm:コンテナを使用後に即座に削除することを示します。
- --server:指定します。
証明書の申請#
export ACMEPATH="/volume1/docker/acme.sh"
export DOMAIN="mail@example.com"
export CFTOKEN="Gl8exdSXRRwGxg5EjVnTDzYY42" # Cloudflareで取得したトークン
docker run --rm \
-v "${ACMEPATH}":/acme.sh \
-e CF_Token="${CFTOKEN}" \
--net=host \
neilpang/acme.sh \
--issue \
--dns dns_cf \
--ocsp \
--server letsencrypt \
-d "${DOMAIN}" \
-d "*.${DOMAIN}"
CFTOKEN の変数には、Cloudflare トークンの申請で取得したトークンを入力します。
証明書のデプロイ#
export ACMEPATH="/volume1/docker/acme.sh"
export DOMAIN="immwind.com"
export USERNAME="username" # Synologyのログインアカウント
export PASSWORD="password" # Synologyのログインパスワード
export PORT="5001" # HTTPSポート
docker run --rm \
-v "${ACMEPATH}":/acme.sh \
-e SYNO_Username="${USERNAME}" \
-e SYNO_Password="${PASSWORD}" \
-e SYNO_Scheme="https" \
-e SYNO_Port="${PORT}" \
-e SYNO_Certificate="A different certificate" \
--net=host \
neilpang/acme.sh \
--deploy --insecure \
--deploy-hook synology_dsm \
-d "${DOMAIN}" -d "*.${DOMAIN}"
- SYNO_Certificate:Synology の証明書画面に表示されるドメインの説明です。
デプロイが完了すると、コントロールパネル -> セキュリティ -> 証明書で申請したドメイン証明書を確認し、設定できます。
証明書の自動更新の設定#
Synology Web にログインし、コントロールパネルに移動します:
- タスクスケジューラを選択します。
- 新規作成 -> 予定されたタスク -> ユーザー定義スクリプトを選択します。
- タスク設定 -> コマンド実行の部分に以下の内容(変数を含む)を入力します。
export ACMEPATH="/volume1/docker/acme.sh"
export DOMAIN="immwind.com"
export CFTOKEN="Gl8exdSXRRwGxg5EjVnTDzYY42"
export USERNAME="username" # Synologyのログインアカウント
export PASSWORD="password" # Synologyのログインパスワード
export PORT="5001" # HTTPSポート
docker run --rm \
-v "${ACMEPATH}":/acme.sh \
-e CF_Token="${CFTOKEN}" \
--net=host \
neilpang/acme.sh \
--renew --force \
--dns dns_cf \
--ocsp \
--server letsencrypt \
-d "${DOMAIN}" -d "*.${DOMAIN}"
docker run --rm \
-v "${ACMEPATH}":/acme.sh \
-e SYNO_Username="${USERNAME}" \
-e SYNO_Password="${PASSWORD}" \
-e SYNO_Scheme="https" \
-e SYNO_Port="${PORT}" \
-e SYNO_Certificate="A different certificate" \
--net=host \
neilpang/acme.sh \
--deploy --insecure \
--deploy-hook synology_dsm \
-d "${DOMAIN}" -d "*.${DOMAIN}"
タスクは毎月 1 回実行することができますが、タスクが正常に実行されることを確認するために、まず手動で 1 回実行して成功するかどうかを確認できます。
最後に#
設定が完了した後、突然、[[ESXi]] の証明書も長い間期限切れになっていることに気づきました。それも試してみる価値がありますね。
情報#
環境#
- DSM 7.2
- Docker 20.10.23