immwind

长风

life, the programming and everything

Dockerを使用してSynology NASにSSL証明書を申請し、自動更新を設定する

イントロダクション#

  • acme.sh:証明書の自動申請と更新のためのツール
  • Cloudflare:ドメイン解析とホスティングプラットフォーム(そのうちの 1 つのサービス)
  • Let’s Encrypt:無料の証明書発行機関(有効期間は 3 ヶ月)

準備#

Cloudflare トークンの申請#

ドメインの検証を行うために、ドメインの DNS 権限を編集するためのトークンを申請する必要があります:

  1. ユーザー API トークントークンを作成をクリックします。
  2. DNS エリアを編集をクリックして、テンプレートを使用を選択します。
  3. エリアリソースで証明書を申請するドメインを選択します。
  4. 保存します。

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 にログインし、コントロールパネルに移動します:

  1. タスクスケジューラを選択します。
  2. 新規作成 -> 予定されたタスク -> ユーザー定義スクリプトを選択します。
  3. タスク設定 -> コマンド実行の部分に以下の内容(変数を含む)を入力します。
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

参考#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。