🔐

セルフホストDokployでXserverSSLの証明書を使う方法

に公開

はじめに

弊社では、短期イベントやPoCなどのWebアプリケーションをDokployというOSSでホスティングしています。

Dokployって何?という方のために簡単に説明すると、VercelやHerokuのようなPaaSを自前のVPSで構築できるOSSです。内部的にはDockerとTraefikで動いており、GitHubと連携してpushするだけでデプロイできる便利なツールです。

通常、DokployではSSL証明書にLet's Encryptを使用しており、これはDokployのGUIから簡単に設定できます。ワンクリックで無料のSSL証明書が使えるので、普段はこれで十分でした。

Let's Encryptの制限に引っかかった話

先日、VPSサーバーを移管することになりました。新しいVPSにDokployをインストールして、ドメインを設定しようとしたところ...

Error: too many certificates already issued for exact set of domains

Let's Encryptの制限に引っかかってしまいました[1]

どうやら、移管作業中に何度か証明書の取得を試行してしまい、制限に達してしまったようです。具体的には以下のような作業をしていました:

  • DNSの切り替え前にドメインを設定して失敗
  • サブドメインの設定ミスで複数回リトライ
  • テスト環境での動作確認で証明書を取得

Let's Encryptには「同一ドメインセットに対して週に5回まで」という制限があり、これを超えると1週間待たなければなりません。でも、移管作業は今日中に終わらせる必要がある...

というわけで、急遽独自のSSL証明書を使うことにしました。今回はXserverSSLを選択したので、その導入手順をメモとして残しておきます。

大まかな手順

SSL証明書の導入は以下の流れで進めます:

  1. 承認用メールアドレスの準備
  2. XserverSSLでSSL証明書を契約
  3. CSRと秘密鍵の生成
  4. ドメイン認証
  5. 証明書の取得
  6. Dokployへの証明書配置
  7. Traefik設定
  8. 動作確認

それでは順番に見ていきましょう。

Step 0: 承認用メールアドレスの準備 📧

まず最初に、ドメイン認証で必要になるメールアドレスを準備します。

SSL証明書の申請では、以下のいずれかのメールアドレスで承認メールを受信する必要があります:

admin@your-domain.com
administrator@your-domain.com
hostmaster@your-domain.com
postmaster@your-domain.com
webmaster@your-domain.com

Step 1: XserverSSLでSSL証明書を契約 💳

XserverSSLにアクセスして、SSL証明書を契約します[2]

利用サービスの選択

ここが重要なポイントです。利用サービスを選択する際は必ず「Xserver VPS / 他社サーバー」を選択してください。

間違えて「Xserver レンタルサーバー」を選んでしまうと、VPSでは使えない証明書が発行されてしまいます。

SSL証明書の種類

今回は一番お手頃な「CloudSSL」を選択しました。

  • 価格: 836円〜/年
  • サイトシール対応
  • ドメイン認証(DV)

急ぎだったので、即日発行可能なDV証明書一択でした。

Step 2: CSRと秘密鍵の生成 🔑

XserverSSLの管理画面から「取得申請」ボタンを押下します。

CSR生成画面での入力

以下の情報を入力します:

コモンネーム: your-domain.com (例: example.com)
国名: JP
都道府県: Tokyo
市区町村: Shibuya-ku
組織名: Your Company Name
部署名: IT Department (省略可)

Step 3: ドメイン認証 ✅

申請が完了すると、Step 0で準備したメールアドレスに承認メールが届きます。

メール内のリンクをクリックして承認を完了させます。承認後、だいたい1時間くらいで証明書が発行されます。

Step 4: 証明書のダウンロード 📥

証明書が発行されたら、以下をダウンロードします:

  1. SSL証明書(サーバー証明書)
  2. 中間証明書(1つまたは2つ)

XserverSSLの場合、中間証明書は通常2つあります:

  • CloudSecureの中間証明書
  • Sectigoの中間証明書

Step 5: Dokployへの証明書配置 🚀

ここからが本番です。Dokployに証明書を配置していきます。

SSH接続して準備

まず、VPSにSSH接続して証明書を配置するディレクトリを確認します:

# ディレクトリ確認
ls -la /etc/dokploy/traefik/dynamic/certificates/

# 空ファイル作成
sudo touch /etc/dokploy/traefik/dynamic/certificates/your-domain.key
sudo touch /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
sudo chmod 600 /etc/dokploy/traefik/dynamic/certificates/your-domain.*

Dokploy GUIでの作業

  1. Dokployの管理画面にログイン
  2. Traefik File System を開く
  3. dynamiccertificates フォルダへ移動

秘密鍵の配置

your-domain.key ファイルを編集して、XserverSSLで生成した秘密鍵を貼り付けます。

証明書チェーンの作成

your-domain.crt ファイルを編集して、以下の順序で証明書を貼り付けます:

-----BEGIN CERTIFICATE-----
[サーバー証明書の内容]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[中間証明書1の内容]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[中間証明書2の内容]
-----END CERTIFICATE-----

Step 6: Traefik設定ファイルの作成 ⚙️

次に、Traefikが証明書を認識できるように設定ファイルを作成します。

sudo tee /etc/dokploy/traefik/dynamic/custom-cert.yml > /dev/null << 'EOF'
tls:
  certificates:
    - certFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
      keyFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.key
      stores:
        - default
  stores:
    default:
      defaultCertificate:
        certFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
        keyFile: /etc/dokploy/traefik/dynamic/certificates/your-domain.key
EOF

sudo chmod 644 /etc/dokploy/traefik/dynamic/custom-cert.yml

Step 7: Dokploy GUIでのドメイン設定 🎯

いよいよ最後の設定です。

  1. 対象プロジェクトの Domains タブを開く
  2. 該当ドメインの設定を編集
  3. 以下を設定:
項目 設定値
HTTPS ✅ 有効
Certificate Provider Custom
Custom Certificate Resolver custom-file
  1. Update をクリック

ここがトリッキーなポイント

実は custom-file というresolverは存在しません。でも大丈夫です。

Traefikはエラーを出しますが、フォールバックとして custom-cert.yml で定義した defaultCertificate を使用してくれます。これはDokployの実装仕様を逆手に取った裏技です。

エラーログに以下のようなメッセージが出ますが、これは正常動作です:

ERR Router uses a non-existent certificate resolver

むしろこのエラーが出ないと動かないという、なんとも不思議な仕様です 🤔

Step 8: 動作確認 🔍

最後に、SSL証明書が正しく設定されているか確認します。

証明書チェーンの確認

# 証明書が3つ含まれているか確認
sudo grep -c 'BEGIN CERTIFICATE' /etc/dokploy/traefik/dynamic/certificates/your-domain.crt
# 結果: 3

SSL接続の検証

echo | openssl s_client -servername your-domain.com -connect your-domain.com:443 2>&1 | grep "Verify return code"
# 結果: Verify return code: 0 (ok)

ブラウザで確認

最後に、ブラウザでHTTPSアクセスして、証明書の警告が出ないことを確認します。

鍵マーク🔒をクリックして証明書の詳細を見ると、XserverSSLの証明書が使われていることが確認できるはずです。

トラブルシューティング 🛠️

証明書が信頼されない場合

証明書チェーンが正しく設定されているか確認:

sudo openssl crl2pkcs7 -nocrl -certfile /etc/dokploy/traefik/dynamic/certificates/your-domain.crt | openssl pkcs7 -print_certs -noout

3つの証明書情報が表示されればOKです ✨

Traefikが証明書を読み込まない場合

Traefikのログを確認:

docker logs dokploy-traefik 2>&1 | grep -i "certificate\|resolver" | tail -20

まとめ

というわけで、Let's Encryptの制限に引っかかった時の対処法として、DokployでXserverSSLの証明書を使う方法をまとめました。

正直なところ、Let's Encryptで十分なんですけどね...自動更新もできるし、無料だし。でも、制限に引っかかってしまったら待つしかないので、こういう回避策も知っておくと便利です。

今回の移管作業は無事完了し、サイトも問題なく動作しています。Let's Encryptの制限が解除されたら、また戻すかもしれませんが、年間836円なら継続してもいいかなとも思っています。

特に「存在しないresolverを指定してdefaultCertificateにフォールバックさせる」という裏技は、Dokployのソースコードを読んで発見しました。公式ドキュメントには載ってないので、この記事が誰かの役に立てば嬉しいです。

それでは、良いDokployライフを! 🎉

参考リンク 📚

脚注
  1. Let's Encrypt - Rate Limits ↩︎

  2. XserverSSL ↩︎

株式会社 髪にドラマを

Discussion