Skip to content

ドメインと HTTPS 証明書

インストール直後にほぼ全員がやること:自分のドメインを向けるHTTPS にする。その次に来るのが複数ドメインの登録と、サブストア用のワイルドカード証明書です。

サブストア(サブドメイン)に必要なのはワイルドカード証明書で、通常の証明書とは発行方法が違います。ワイルドカード証明書を直接ご覧ください。

1. ドメインをサーバーに向ける

手順 1:DNS の設定

ドメインを買った事業者(お名前.com、Cloudflare、各種クラウドなど)で次を追加します。

種別ホスト名
A@サーバーの IP
Awwwサーバーの IP

@ はサブドメインなしのドメイン(abc.com)、wwwwww.abc.com です。両方追加しておけば、どちらを入力しても開きます。

反映は通常数分です。確認:

bash
ping abc.com

サーバーの IP が表示されれば成功です(応答が無くても構いません。ping を塞いでいるサーバーは多いです)。

手順 2:サーバー側でドメインを登録

DNS だけでは足りません。 Web サーバー側もそのドメインを受け付ける必要があり、そうでないと既定サイトに飛ぶかエラーになります。

宝塔パネル:サイト → 対象サイト → ドメイン管理abc.comwww.abc.com を追加。

Docker:登録は不要です。イメージに nginx が同梱されているため、DNS が向いた時点でアクセスでき、証明書もコンテナの中で発行します。Docker で HTTPS にするを参照。

2. HTTPS 証明書を取得する

宝塔で取る(いちばん簡単)

サイト → 対象サイト → SSLLet's Encrypt を選択 → 対象ドメインにチェック → 申請。

発行できたら必ず「HTTPS を強制」を有効にしてください。そうしないと http:// でもアクセスでき、ブラウザは自動的に切り替えません。

証明書の有効期間は 90 日で、宝塔が自動更新します。

発行に失敗するとき

Let's Encrypt は http://あなたのドメイン/.well-known/acme-challenge/xxx にアクセスして所有確認を行います。ここで失敗すると発行されません。

症状原因
認証失敗/404ドメインがこのサーバーに向いていない、または DNS が未反映
接続がタイムアウトするポート 80 が閉じている(クラウドではセキュリティグループで開放が必要)
CDN を通すと失敗する一度 CDN を外して発行するか、DNS 認証に切り替える
何度か失敗した後ずっと失敗するLet's Encrypt のレート制限です。1 時間待ってから再試行

同梱の URL 書き換えルールは .well-known を許可済みなので、認証を妨げません。自分で書き換えた場合はこの例外を残してください(URL 書き換えルール)。

3. Docker で HTTPS にする

イメージには nginx と certbot が同梱されているため、証明書はコンテナの中で発行します。 パネルも別立てのリバースプロキシも不要です。

80 と 443 の両方を公開します。

bash
docker run -d --name faka -p 80:80 -p 443:443 -v acg_data:/data --restart unless-stopped ghcr.io/lizhipay/acg-faka:latest

コマンド 1 行で証明書を発行します(ドメインとメールは自分のものに)。

bash
docker exec faka acg-ssl shop.abc.com [email protected]

自動更新をホスト側に登録します。

bash
(crontab -l 2>/dev/null; echo "0 3 * * * docker exec faka acg-ssl-renew") | crontab -

証明書と nginx 設定はデータボリュームにあるので、イメージを入れ替えてもコンテナを作り直しても残ります。詳しい手順と切り分けは Docker でインストールにあります。

ポート 80 が別のサイトで使用中の場合にだけ、前段にリバースプロキシが必要になります。その場合は acg-ssl を実行せず、証明書はプロキシ層に任せてください。

すでに証明書をお持ちですか(Cloudflare のオリジン証明書、購入した証明書)? acg-ssl-import でそのまま導入できます。Let's Encrypt への申請は不要で、ワイルドカードにも対応しています。Docker でインストールを参照。

4. 1 つのサイトに複数ドメイン

新しいドメインに移行しつつ旧ドメインも残す、メインドメインと短縮ドメインを併用する、といった場面でよく使います。

どちらの構成でも最初にこれ:すべてのドメインを同じサーバー IP に向けます。

Docker:コマンド 1 行で済みます。ドメインを並べて最後にメールアドレスを置くと、すべて 1 枚の証明書にまとまります。

bash
docker exec faka acg-ssl abc.com www.abc.com shop.abc.com [email protected]

後からドメインを足すときは、すべてのドメインを並べて実行し直してください。書かなかったドメインは証明書から外れます。また 1 つでも解決しないドメインがあると証明書全体が失敗します。詳細は Docker でインストール

宝塔

  1. サイト → サイト設定 → ドメイン管理 ですべて追加
  2. 証明書を発行する際、すべてのドメインにチェックを入れる。1 枚の証明書で複数ドメインを覆えます。入れ忘れたドメインは証明書エラーになります

副ドメインをメインへ転送する

同じサイトが複数ドメインで見えると SEO の評価が分散するため、通常は副ドメインを 301 で転送します。URL 書き換えルールの先頭に追加します。

nginx
if ($host != 'abc.com') {
    return 301 https://abc.com$request_uri;
}

サブストアを使う場合は追加しないでください。 すべてのサブストアのドメインまでメインサイトに転送されてしまいます。

5. ワイルドカード証明書(サブストアに必須)

サブストアを有効にすると、販売者の店舗は xxx.abc.com になります。これらのサブドメインは動的に作られ事前に分からないため、通常の証明書では覆えません*.abc.com のワイルドカード証明書が必要です。

通常の証明書との違い

通常の証明書は HTTP 認証(/.well-known/... へのアクセス)ですが、ワイルドカード証明書は DNS 認証しか使えません。ドメインの所有を証明する TXT レコードを追加します。

宝塔での発行手順

サイト → SSL → Let's Encrypt → 認証方式を DNS 認証 に設定:

  • 対応事業者のドメインなら、宝塔が API 経由で TXT レコードを追加し自動更新まで行えます。こちらを強く推奨します
  • 手動の場合は自分で TXT レコードを追加しますが、90 日ごとにやり直しが必要で、忘れるとサイト全体の証明書が失効します

2 つをまとめて発行します。

abc.com
*.abc.com

*.abc.comabc.com 自身は含まれません。両方発行しないとメインサイトが証明書エラーになります。

サブストアの確認リスト

サブドメインが開けないときは、この順で確認してください。4 つすべてが必要です。

#確認項目
1サイト設定 → その他で本店ドメインと DNS-CNAME を設定済み
2DNS にワイルドカード * レコードがあり、サーバー IP を指している
3サーバー側で *.abc.com を登録済み(宝塔のドメイン管理に追加)—— 最も見落とされる
4*.abc.com のワイルドカード証明書を発行済み

残りはサブストアを参照してください。

6. よくある問題

ブラウザに「保護されていない通信」や証明書エラーが出る 開いたドメインが証明書の対象に入っていません。発行時にチェックしたか確認を。サブドメインにはワイルドカード証明書が必要です。

証明書を入れたのに http:// でも開ける Docker:acg-ssl を実行した時点で強制転送は有効です。まだ http で開けるなら、証明書の発行に失敗しているか nginx が再読み込みされていません。もう一度実行してください。宝塔:SSL ページ右上の「HTTPS を強制」を有効に。

HTTPS 強制にしたら開けない/リダイレクトが無限に続く CDN やプロキシのオリジン接続方式と転送設定が衝突しています。CDN が http でオリジンを取得し、サイト側が https を強制すると抜け出せません。CDN のオリジンを HTTPS にするか、サイト側の転送を切って CDN に任せてください。Docker なら docker exec faka acg-ssl あなたのドメイン [email protected] --no-redirect、宝塔なら「HTTPS を強制」をオフにします。

ドメイン変更後に画像やスタイルが崩れる 管理画面のサイトドメインが旧いままです。サイト設定で変更し、runtime/view/compile の中身を削除してテンプレートキャッシュを消してください。

決済のコールバックが失敗する 決済事業者側に設定したコールバック URL が旧ドメインのままです。CDN のファイアウォールがコールバックを遮断していることもあります(サイト設定のカスタム決済コールバックドメイン)。

MIT ライセンスで公開