この記事のポイント
- 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から実際に取得したものです。

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証明書を提供する非営利団体」と書かれており、いまや個人サイトから大企業まで広く使われています。

certbot は、その Let’s Encrypt の証明書を自動で取得・更新する公式クライアントです。Ubuntu なら apt で入り、python3-certbot-nginx というプラグインを併せて入れると、nginx の設定ファイルを自動で書き換えてくれます。
証明書の有効期限は90日間ですが、certbot が systemd タイマーで自動更新するので、期限切れを気にする必要はありません(仕組みは後半で実際の設定ファイルを見ながら解説します)。
手順1:nginx をインストールして動作確認する
まずはWebサーバーとして nginx をインストールします。certbot の nginx プラグインが nginx の設定を書き換えるので、certbot より先に 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.04 で apt install nginx を流した実出力です。Ubuntu 24.04 では nginx/1.24.0 が入り、nginx -t で test is successful と出れば設定ファイルの文法はOKです。
インストール直後にブラウザでVPSのIPアドレスにアクセスすると、nginx のデフォルトページが表示されます。手元でも nginx コンテナを起動してブラウザで開いてみました。

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

Ubuntu 24.04 公式リポジトリで apt-cache policy を引いた実測値です。nginx 1.24.0・certbot 2.9.0・openssl 3.0.13・python3-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 です(実測)。
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.com と www.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の変更は、世界中のリゾルバに伝播するまで数分〜数時間かかります。反映されたかどうかは dig や nslookup で確認できます。実際に存在するドメインで引くと、こんなふうに登録済みのIPが返ってきます。
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 プラグインをインストールします。

上は docker run --rm ubuntu:24.04 で実際に apt install certbot python3-certbot-nginx を流し、certbot --version と certbot plugins を取得した実出力です。ポイントは certbot plugins の一覧に nginx が Authenticator と Installer の両方として現れている点です。これが --nginx オプションで設定を自動書き換えできる正体です。standalone(単体HTTPサーバーで認証)や webroot(既存のドキュメントルートで認証)も同じ版で使えます。
certbot と python3-certbot-nginx は同じバージョン(2.9.0-1)でセットインストールされます。python3-acme(ACMEプロトコル実装)も同時に入ります。
手順4:SSL証明書を取得してnginxに適用する
いよいよ証明書を取得します。--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 の設定を自動で書き換えます。変更後はだいたい次のような形になります。
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.04 で certbot を入れた直後の、本物のファイル内容です。
[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 に置きますが、その中にこう書かれています。
# 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)の証明書を取得した実出力がこちらです。
| 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 のバージョンを比べました。

Ubuntu 22.04(Jammy)では certbot 1.21.0・OpenSSL 3.0.2・nginx 1.18.0。対して 24.04(Noble)では certbot 2.9.0・OpenSSL 3.0.13・nginx 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 statusでNginx 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 が証明書ファイルを読めないケースです。パスが正しいかを確認します。
cert.pem chain.pem fullchain.pem privkey.pem README
nginx で指定するのは fullchain.pem(中間証明書込み)と privkey.pem です。cert.pem 単体を指定すると中間証明書が欠けて、ブラウザによっては検証エラーになります。
④証明書の更新が失敗している
自動更新がうまくいっていないときは、まずログを確認します。
$ 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選びから迷っている場合は、 もあわせて参考にしてください。


コメント