VPSにドメインとSSL証明書(Let’s Encrypt)を設定する手順

サーバー構築

この記事のポイント

  • VPSにドメインをつなげる作業の本体は「ドメインのAレコードをVPSのIPアドレスに向ける」だけです
  • SSL証明書の取得は apt install certbot python3-certbot-nginx の1行から。Ubuntu 24.04 では certbot 2.9.0 が入ります(実測確認)
  • sudo certbot --nginx -d ドメイン名 を実行すると、nginxの設定ファイルまで自動で書き換えてHTTPS化してくれます
  • 証明書の有効期限は90日ですが、certbot.timer(systemd)が1日2回、自動で更新チェックをします(中身を実取得して確認しました)
  • Ubuntu 22.04 より 24.04 のほうが certbot・OpenSSL のバージョンが新しく、セキュリティ面でも推奨です(実測比較あり)

VPSを借りたら最初にやっておきたいのが、独自ドメインの設定とHTTPS化です。「http://」のままだと、Chromeのアドレスバーに「保護されていない通信」と表示されてしまい、せっかく作ったサービスの信頼感が下がってしまいます。

この記事では、VPS(Ubuntu 24.04 LTS)に独自ドメインを設定し、Let’s Encrypt の無料SSL証明書certbot で取得してHTTPS化するまでの手順を解説します。バージョン番号や証明書の中身、自動更新の仕組みは、すべて手元の Docker(ubuntu:24.04 / ubuntu:22.04 公式イメージ)で実際にコマンドを動かして取得した値です。想像で書いた数字は使っていません。

注意

本記事のコマンドは Ubuntu 24.04 LTS(Noble Numbat)で検証しています。Let’s Encrypt の証明書を実際に取得するには、インターネットから到達できる公開VPSと、DNSに登録済みのドメインが必要です。ローカルや Docker 単体では「証明書の取得」自体はできません(その代わり、本記事ではパッケージ版数・証明書の中身・自動更新ユニットなど検証できる部分はすべて実測しています)。

前提条件と用意するもの

手順を始める前に、次の3つが揃っていることを確認してください。

  • VPS:グローバルIPアドレスが割り当てられていて、ポート80・443が開放できるもの
  • ドメイン:お名前.comやXserverドメインなどで取得済みのドメイン
  • OS:Ubuntu 24.04 LTS(22.04でも動きますが、certbot のバージョンが古くなります。詳細は後述)

VPSをまだ決めていない場合は、まず料金感をつかんでおきましょう。下の表は、東京リージョン(nrt)に対応する Vultr のプランを公式APIから実際に取得したものです。

Vultr 東京リージョン対応プランの月額(公式API実取得)
Vultr 東京リージョン対応プランの月額(公式API実取得)

HTTPSサイトを1つ立てて学ぶだけなら、最安の vc2-1c-1gb(1 vCPU / 1GB RAM / 25GB SSD)で月 $5 から始められます。東京リージョンを持つのは Vultr と ConoHa VPS で、英語に抵抗がなければ Vultr、日本語サポートを重視するなら ConoHa VPS がおすすめです。

Let’s Encrypt と certbot について

Let’s Encrypt は、非営利団体 ISRG が運営するSSL/TLS証明書の無料発行サービスです。公式サイトには「世界の7億以上のWebサイトに無料のTLS証明書を提供する非営利団体」と書かれており、いまや個人サイトから大企業まで広く使われています。

Let's Encrypt 公式サイト(letsencrypt.org をブラウザで表示)
Let’s Encrypt 公式サイト(letsencrypt.org をブラウザで表示)

certbot は、その Let’s Encrypt の証明書を自動で取得・更新する公式クライアントです。Ubuntu なら apt で入り、python3-certbot-nginx というプラグインを併せて入れると、nginx の設定ファイルを自動で書き換えてくれます。

証明書の有効期限は90日間ですが、certbot が systemd タイマーで自動更新するので、期限切れを気にする必要はありません(仕組みは後半で実際の設定ファイルを見ながら解説します)。

手順1:nginx をインストールして動作確認する

まずはWebサーバーとして nginx をインストールします。certbot の nginx プラグインが nginx の設定を書き換えるので、certbot より先に nginx を入れておくのがポイントです。




ubuntu@vps-server: ~
$ sudo apt update && sudo apt install -y nginx
0 upgraded, 10 newly installed, 0 to remove and 6 not upgraded.
Unpacking nginx-common (1.24.0-2ubuntu7.11) …
Unpacking nginx (1.24.0-2ubuntu7.11) …
Setting up nginx-common (1.24.0-2ubuntu7.11) …
Setting up nginx (1.24.0-2ubuntu7.11) …
$ nginx -v
nginx version: nginx/1.24.0 (Ubuntu)
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

これは実際に docker run --rm ubuntu:24.04apt install nginx を流した実出力です。Ubuntu 24.04 では nginx/1.24.0 が入り、nginx -ttest is successful と出れば設定ファイルの文法はOKです。

インストール直後にブラウザでVPSのIPアドレスにアクセスすると、nginx のデフォルトページが表示されます。手元でも nginx コンテナを起動してブラウザで開いてみました。

nginx デフォルトページ(起動した nginx をブラウザで表示)
nginx デフォルトページ(起動した nginx をブラウザで表示)

「Welcome to nginx! If you see this page, nginx is successfully installed and working.」と出れば、Webサーバーは正しく動いています。ここに後でHTTPSをかぶせていきます。続いて、入ったパッケージのバージョンをまとめて確認しておきましょう。

ドメイン+SSL設定に必要なパッケージのバージョン(Ubuntu 24.04 実測)
ドメイン+SSL設定に必要なパッケージのバージョン(Ubuntu 24.04 実測)

Ubuntu 24.04 公式リポジトリで apt-cache policy を引いた実測値です。nginx 1.24.0certbot 2.9.0openssl 3.0.13python3-certbot-nginx 2.9.0 と、いずれも apt だけで揃います。追加のPPA登録は不要です。

手順1-2:UFWファイアウォールでポートを開放する

VPSに ufw(Ubuntu標準のファイアウォール設定ツール)が有効になっている場合は、HTTP(80)と HTTPS(443)を開放します。Ubuntu 24.04 の ufw は 0.36.2-6 です(実測)。




ubuntu@vps-server: ~
$ sudo ufw allow ‘Nginx Full’
Rules updated
Rules updated (v6)
$ sudo ufw status
Status: active
To Action From
— —— —-
Nginx Full ALLOW Anywhere
OpenSSH ALLOW Anywhere

Nginx Full は80番と443番をまとめて開けるプリセットです。'Nginx HTTP'(80番のみ)もありますが、HTTPS化するなら Nginx Full を選びます。

注意:SSHのポートを必ず先に許可すること

ufw enable すると、許可していないポートはすべて遮断されます。SSH(22番)を許可する前に有効化すると、自分が締め出されます。sudo ufw allow OpenSSH を必ず先に実行してから enable してください。SSHが切れた場合は、VPSのコントロールパネルのコンソールからしか入れなくなります。

手順2:DNSのAレコードを設定する

ドメイン管理会社のDNS設定画面で、AレコードにVPSのグローバルIPアドレスを登録します。example.comwww.example.com の両方を同じIPに向けるなら、次のように設定します。

種別 ホスト名 値(IPアドレス) TTL
A example.com(または @ 203.0.113.10(VPSのIPアドレス) 3600
A www.example.com(または www 203.0.113.10(同じIPアドレス) 3600

DNSの変更は、世界中のリゾルバに伝播するまで数分〜数時間かかります。反映されたかどうかは dignslookup で確認できます。実際に存在するドメインで引くと、こんなふうに登録済みのIPが返ってきます。




ubuntu@vps-server: ~(ubuntu:24.04 実測)
$ dig +short A letsencrypt.org
52.74.6.109
13.215.239.219
$ nslookup letsencrypt.org 8.8.8.8
Address: 8.8.8.8#53
Name: letsencrypt.org
Address: 52.74.6.109

これは実際に dnsutils を入れて引いた結果です(例として letsencrypt.org を使用)。自分のドメインで引いたときにVPSのIPアドレスが返ってくれば、DNS設定は反映済みです。返ってこない、あるいは別のIPが返る場合は、もう少し待つか設定を見直します。

手順3:certbot をインストールする

DNSが反映されたら、certbot と nginx プラグインをインストールします。

certbot のインストールとプラグイン認識(Ubuntu 24.04 実測)
certbot のインストールとプラグイン認識(Ubuntu 24.04 実測)

上は docker run --rm ubuntu:24.04 で実際に apt install certbot python3-certbot-nginx を流し、certbot --versioncertbot plugins を取得した実出力です。ポイントは certbot plugins の一覧に nginxAuthenticator と Installer の両方として現れている点です。これが --nginx オプションで設定を自動書き換えできる正体です。standalone(単体HTTPサーバーで認証)や webroot(既存のドキュメントルートで認証)も同じ版で使えます。

certbotpython3-certbot-nginx は同じバージョン(2.9.0-1)でセットインストールされます。python3-acme(ACMEプロトコル実装)も同時に入ります。

手順4:SSL証明書を取得してnginxに適用する

いよいよ証明書を取得します。--nginx を指定すると、certbot が認証から nginx 設定の書き換えまで自動でやってくれます。

certbot --nginx で証明書を取得する流れ(再現イメージ)
certbot –nginx で証明書を取得する流れ(再現イメージ)

初回実行時はメールアドレスの登録と利用規約への同意を求められます。メールアドレスは証明書期限の通知(更新が失敗したときの警告など)に使われるので、受け取れるアドレスを入れてください。成功すると、証明書ファイルが次の場所に保存されます。

  • /etc/letsencrypt/live/example.com/fullchain.pem:証明書本体(nginx の ssl_certificate で指定)
  • /etc/letsencrypt/live/example.com/privkey.pem:秘密鍵(nginx の ssl_certificate_key で指定)

この画面について

上の端末画像は再現イメージです。証明書の発行には公開VPSとDNS登録済みドメインが必要なため、ダミードメイン example.com で代表的な出力を再現しています。表示される有効期限が約90日になる点は、後述する「本物の Let’s Encrypt 証明書」の実測結果とも一致しています。

手順4-2:certbot が書き換えたnginx設定を確認する

certbot は nginx の設定を自動で書き換えます。変更後はだいたい次のような形になります。




ubuntu@vps-server: ~
$ sudo cat /etc/nginx/sites-available/example.com
server {
server_name example.com www.example.com;
root /var/www/html;
index index.html;
# certbot が追加した SSL 設定 ↓
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
$ sudo nginx -t && sudo systemctl reload nginx
nginx: configuration file /etc/nginx/nginx.conf test is successful

certbot は listen 443 ssl の追加と、HTTP→HTTPS リダイレクト(return 301)の挿入を自動で行います。これで http://example.com へのアクセスは自動的に https:// に転送されます。

手順5:証明書の自動更新を確認する

Let’s Encrypt の証明書は90日で切れますが、certbot はインストール時に systemd タイマー(certbot.timer)を仕込んでくれるので、放っておいても自動で更新されます。動作を確認しておきましょう。

証明書の確認と自動更新シミュレーション(再現イメージ)
証明書の確認と自動更新シミュレーション(再現イメージ)

certbot renew --dry-run は、実際には更新せず「更新が成功するか」だけをシミュレートするコマンドです。all simulated renewals succeeded と出れば、自動更新の段取りは正常です。

この自動更新の正体は何なのか、気になったので certbot パッケージが配置する実ファイルの中身を取得してみました。次は ubuntu:24.04certbot を入れた直後の、本物のファイル内容です。




ubuntu@linuxlab:~(ubuntu:24.04 実測)
$ cat /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target
$ cat /lib/systemd/system/certbot.service
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew –no-random-sleep-on-renew
PrivateTmp=true

つまり certbot は 毎日 00:00 と 12:00 の1日2回OnCalendar=*-*-* 00,12:00:00)更新チェックを走らせます。RandomizedDelaySec=43200 は最大12時間のランダム遅延で、世界中のサーバーが同時刻にLet’s Encryptへアクセスして負荷が集中しないための配慮です。Persistent=true なので、VPSが停止していて実行をまたいでも、起動後にちゃんと拾ってくれます。実際に更新が走るのは、有効期限まで30日を切った証明書だけです。

ちなみに certbot は cron 用のファイルも /etc/cron.d/certbot に置きますが、その中にこう書かれています。




ubuntu@linuxlab:~(ubuntu:24.04 実測)
$ cat /etc/cron.d/certbot
# Important Note! This cronjob will NOT be executed if you are
# running systemd as your init system. If you are running systemd,
# the cronjob.timer function takes precedence over this cronjob.
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e ‘sleep int(rand(43200))’ && certbot -q renew –no-random-sleep-on-renew

コメントにある通り、systemd が動いている環境では cron 側は実行されません! -d /run/systemd/system の条件で自分を無効化します)。VPSはほぼ systemd なので、実際に効くのは certbot.timer のほうです。cron.d のエントリは systemd を使わない古い環境向けのフォールバックだと分かります。「タイマーと cron、どっちが動くの?」という疑問はこれで解消です。

Let’s Encrypt の証明書の中身を実際にのぞいてみる

「90日で切れる」と言われても実感がわかないので、本物の Let’s Encrypt 証明書を openssl で取得して中身を見てみました。Let’s Encrypt 自身のサイト(letsencrypt.org)の証明書を取得した実出力がこちらです。




ubuntu@linuxlab:~(ubuntu:24.04 / OpenSSL 3.0.13 実測)
$ echo | openssl s_client -connect letsencrypt.org:443 -servername letsencrypt.org 2>/dev/null \
| openssl x509 -noout -issuer -subject -dates
issuer=C = US, O = Let’s Encrypt, CN = E7
subject=CN = letsencrypt.org
notBefore=May 7 16:14:37 2026 GMT
notAfter=Aug 5 16:14:36 2026 GMT

注目してほしいのは notBefore(発行日)と notAfter(失効日)です。5月7日発行・8月5日失効で、ちょうど90日間。記事で「有効期限は90日」と書いてきたのは、まさにこの実物の挙動です。発行元(issuer)は CN = E7、これは Let’s Encrypt の ECDSA系の中間証明書です。短い有効期限を自動更新でカバーするのが Let’s Encrypt の設計思想で、だからこそ certbot の自動更新が重要になるわけですね。

Ubuntu 22.04 と 24.04 での certbot バージョン比較

「22.04のままでもいい?」とよく聞かれるので、両方のコンテナで実際に apt のバージョンを比べました。

certbot・OpenSSL・nginx バージョン比較(Ubuntu 22.04 vs 24.04 実測)
certbot・OpenSSL・nginx バージョン比較(Ubuntu 22.04 vs 24.04 実測)

Ubuntu 22.04(Jammy)では certbot 1.21.0OpenSSL 3.0.2nginx 1.18.0。対して 24.04(Noble)では certbot 2.9.0OpenSSL 3.0.13nginx 1.24.0 と、軒並み新しくなっています。

特に certbot は 1.x から 2.x へのメジャーアップ、OpenSSL も 3.0.2(2022年)から 3.0.13(2024年)へと多数のCVE修正を取り込んだ版に上がっています。これから新しくVPSを立てるなら、迷わず Ubuntu 24.04 LTS を選んでおくのが無難です。

よくあるエラーと解決策

①「Connection refused」または「Timeout」エラー

certbot が Let’s Encrypt のサーバー、もしくは Let’s Encrypt からあなたのVPSへの折り返し通信(HTTP-01チャレンジ)に失敗したときに出ます。

確認ポイント

  • ポート80・443が開いているか(sudo ufw statusNginx Full が ALLOW か)
  • VPSのコントロールパネル側でポートフィルタリングが効いていないか
  • DNSが反映されているか(dig +short A ドメイン名 でVPSのIPが返るか)

②「Type: unauthorized」エラー

Let’s Encrypt がドメインの所有確認(チャレンジ)に失敗したケースです。

  • DNSの変更が反映されていない → dig / nslookup で再確認し、数分待つ
  • nginx が起動していない → sudo systemctl start nginx
  • nginx の設定にドメインが無い → server_name にドメインが入っているか確認

③「nginx: [emerg] cannot load certificate」エラー

nginx が証明書ファイルを読めないケースです。パスが正しいかを確認します。




ubuntu@vps-server: ~
$ sudo ls /etc/letsencrypt/live/example.com/
cert.pem chain.pem fullchain.pem privkey.pem README

nginx で指定するのは fullchain.pem(中間証明書込み)と privkey.pem です。cert.pem 単体を指定すると中間証明書が欠けて、ブラウザによっては検証エラーになります。

④証明書の更新が失敗している

自動更新がうまくいっていないときは、まずログを確認します。




ubuntu@vps-server: ~
$ sudo tail -30 /var/log/letsencrypt/letsencrypt.log
$ sudo certbot renew –force-renewal
Congratulations, all renewals succeeded.

まとめ

VPSにドメインとSSL証明書を設定する手順は、次のとおりです。

  • nginx を apt でインストール(Ubuntu 24.04 では nginx 1.24.0 が入る)
  • ドメイン管理画面でAレコードにVPSのIPを登録し、dig / nslookup で反映を確認
  • apt install certbot python3-certbot-nginx で certbot 2.9.0 を導入(plugins に nginx が出ればOK)
  • sudo certbot --nginx -d ドメイン名 で証明書取得と nginx 設定の自動書き換え
  • certbot renew --dry-run で自動更新が機能することを確認
  • 自動更新の実体は certbot.timer(1日2回・最大12時間のランダム遅延)。新規構築なら Ubuntu 24.04 LTS を推奨

正直、一番もどかしいのはDNSの反映待ちです。dig で確認しながら気長に待ちましょう。証明書さえ取れれば、あとは certbot.timer が90日サイクルで勝手に更新してくれるので、運用の手間はほとんどありません。実際に証明書の中身も自動更新ユニットも確認したとおり、Let’s Encrypt は「短い有効期限を自動更新で回す」前提でよくできた仕組みです。

VPS選びから迷っている場合は、 もあわせて参考にしてください。

コメント

タイトルとURLをコピーしました