「NginxでWebサイトを公開したけど、HTTPSにする方法がわからない」
こんな悩みを持っていませんか?
Webサイトを公開する上で、HTTPSへの対応はいまや必須です。GoogleもブラウザもSSL証明書のないサイトには警告を表示するようになっています。しかし「SSL証明書を取得する」というだけで難しそうに聞こえる人も多いでしょう。
実は、Let's Encrypt(レッツエンクリプト)というサービスを使えば、SSL証明書は無料で取得でき、certbotというツールを使えばNginxへの設定もほぼ自動化できます。
この記事では、VPSやクラウドサーバー上でNginxを動かしている初心者の方向けに、Let's EncryptとcertbotでHTTPS対応する手順をUbuntu 24.04 LTSとRocky Linux 9の両方で解説します。
この記事のポイント
・Let's Encryptは無料で使えるSSL証明書の発行機関で、有効期限は90日間
・certbot --nginxコマンド1本でNginxの設定を自動的にHTTPS対応に書き換えられる
・事前にドメインのDNSがサーバーのIPアドレスを向いていることと、ポート80/443が開いていることが前提条件
・自動更新設定を忘れると90日後に証明書が切れてサイトにアクセスできなくなる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
SSLとHTTPSとは何か?Linuxサーバーに必要な理由
Webブラウザとサーバーの間でやりとりされるデータは、そのままでは第三者に見られてしまう可能性があります。これを防ぐのがSSL(Secure Sockets Layer)の暗号化技術で、HTTPSはSSLで保護されたHTTP通信のことです。アドレスバーに「https://」と表示されるサイトはSSL証明書が設定されており、「http://」のままのサイトにはChromeやFirefoxが「この接続は安全ではありません」と警告を出します。
| 項目 | HTTP | HTTPS |
|---|---|---|
| 通信の暗号化 | なし | あり(SSL/TLS) |
| ブラウザの表示 | 「安全ではない」と警告表示 | 鍵アイコン表示 |
| SEO(Google評価) | 不利 | 有利 |
| 使用ポート番号 | 80番 | 443番 |
Let's EncryptとcertbotでHTTPS設定の仕組みを理解する
SSL証明書を取得するには、認証機関(CA: Certificate Authority)に申請する必要があります。従来は年間数千円から数万円かかっていましたが、Let's Encryptは無料でSSL証明書を発行してくれる非営利の認証機関です。certbot(サートボット)は、Let's Encryptの証明書取得・設定・更新を自動化するツールです。コマンド1本で、ドメインの認証・証明書の取得・Nginxの設定変更まで行ってくれます。
・Let's Encrypt:証明書を無料で発行してくれる認証機関
・certbot:証明書の取得・設定・更新を自動化するツール
・SSL証明書の有効期限:90日間(certbotで自動更新を設定しておく)
証明書の有効期限が90日と短く設定されている理由は、セキュリティを高めるためです。手動管理では更新を忘れやすいですが、certbotを使えば自動更新できるので実務上は問題ありません。
事前準備:certbot実行前に確認すること
certbotを実行する前に、以下の条件を満たしているかどうか確認してください。チェックリスト
・独自ドメインを取得している(example.comのような独自ドメインが必要。IPアドレスだけではSSL証明書を発行できない)
・DNSがサーバーのIPアドレスを向いている(ドメインのAレコードがVPSのIPアドレスに設定済みであること)
・ポート80と443が開放されている(ファイアウォールでHTTP/HTTPSのポートを許可しておく)
・NginxがHTTPで動いている(certbotはHTTP経由でドメイン所有者を確認するため)
ファイアウォールの確認・設定は以下のコマンドで行います。
# Ubuntu 24.04(UFW)の場合 $ sudo ufw allow 80/tcp $ sudo ufw allow 443/tcp $ sudo ufw status Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443/tcp ALLOW Anywhere # Rocky Linux 9(firewalld)の場合 $ sudo firewall-cmd --permanent --add-service=http $ sudo firewall-cmd --permanent --add-service=https $ sudo firewall-cmd --reload $ sudo firewall-cmd --list-all public (active) services: dhcpv6-client http https ssh
certbotをインストールする方法
1. Ubuntu 24.04 LTSにcertbotをインストールする
Ubuntu 24.04では、snapパッケージマネージャー経由でcertbotをインストールするのが公式推奨方法です。# snapdをインストール(入っていない場合) $ sudo apt update $ sudo apt install -y snapd # snap経由でcertbotをインストール $ sudo snap install --classic certbot certbot 2.11.0 from Certbot Project (certbot-eff) installed # certbotコマンドをパスに通す $ sudo ln -s /snap/bin/certbot /usr/bin/certbot # インストール確認 $ certbot --version certbot 2.11.0
2. Rocky Linux 9にcertbotをインストールする
Rocky Linux 9(RHEL9系)でも、snap経由のインストールが推奨です。まずsnapdを有効にする必要があります。# EPELリポジトリを有効にする $ sudo dnf install -y epel-release # snapdをインストール $ sudo dnf install -y snapd $ sudo systemctl enable --now snapd.socket # snapのクラシックサポートを有効にする $ sudo ln -s /var/lib/snapd/snap /snap # ログアウト・再ログイン後にcertbotをインストール $ sudo snap install --classic certbot certbot 2.11.0 from Certbot Project (certbot-eff) installed # certbotコマンドをパスに通す $ sudo ln -s /snap/bin/certbot /usr/bin/certbot # インストール確認 $ certbot --version certbot 2.11.0
NginxにSSL証明書を取得・設定する手順
1. Nginxの設定ファイルにドメイン名が記載されているか確認する
certbot --nginxを使うには、Nginxの設定ファイルにserver_nameディレクティブでドメイン名が書かれている必要があります。# Nginxのデフォルト設定を確認する(Ubuntu) $ sudo grep -n "server_name" /etc/nginx/sites-enabled/default 5: server_name example.com www.example.com; # Rocky Linux 9の場合 $ sudo grep -n "server_name" /etc/nginx/conf.d/default.conf 5: server_name example.com www.example.com;
server_name _;やserver_name localhost;だけになっている場合は、実際のドメイン名に変更してください。変更後はsudo nginx -tで構文チェックを行い、sudo systemctl reload nginxで反映します。2. certbot --nginxコマンドでSSL証明書を取得する
準備が整ったら、certbotを実行します。-dオプションでSSL証明書を取得したいドメインを指定します。# example.comのSSL証明書を取得する $ sudo certbot --nginx -d example.com -d www.example.com Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for example.com and www.example.com Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem This certificate expires on 2026-10-27. These files will be updated when the certificate renews. Deploying certificate to VirtualHost /etc/nginx/sites-enabled/default Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/default - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com
3. SSL設定が正しく動作しているか確認する
証明書の取得後、実際にHTTPSでアクセスできるかをコマンドで確認します。# curlでHTTPS接続を確認する(-Iはヘッダーのみ表示) $ curl -I https://example.com HTTP/2 200 server: nginx/1.24.0 content-type: text/html; charset=UTF-8 ... # 取得した証明書の情報を確認する $ sudo certbot certificates Found the following certs: Certificate Name: example.com Domains: example.com www.example.com Expiry Date: 2026-10-27 05:32:14+00:00 (VALID: 89 days) Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
SSL証明書の自動更新を設定する
Let's Encryptの証明書は90日で期限が切れます。更新を忘れると、サイトにアクセスした際にブラウザがエラーを表示します。certbotをsnapでインストールした場合は、通常は自動更新のsystemdタイマーが自動的に設定されますが、念のため確認しておきましょう。1. 自動更新のsystemdタイマーを確認する
# systemdタイマーの状態を確認する $ sudo systemctl status snap.certbot.renew.timer snap.certbot.renew.timer - Timer renewing certbot certificates Loaded: loaded (/etc/systemd/system/snap.certbot.renew.timer; enabled) Active: active (waiting) since 2026-07-28 10:00:00 JST Trigger: 2026-07-29 02:45:22 JST
2. --dry-runで更新テストを実行する
実際に証明書を更新せずに、更新処理が正常に動作するかどうかをテストできます。本番運用前に必ず実行しておきましょう。# --dry-runで実際の更新はせずにテスト実行する $ sudo certbot renew --dry-run Saving debug log to /var/log/letsencrypt/letsencrypt.log - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Processing /etc/letsencrypt/renewal/example.com.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Account registered. Simulating renewal of an existing certificate for example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations, all simulated renewals succeeded: /etc/letsencrypt/live/example.com/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
よくあるエラーと対処法
「Problem binding to port 80」でポートが使えない
certbotが--standaloneモードで起動しようとした際に、Nginxがすでにポート80を使っている場合に発生します。--nginxオプションを使えばNginxを停止する必要はありませんが、--standaloneオプションで実行する場合はNginxを一時停止する必要があります。# standaloneモードで実行する場合のみ、Nginxを一時停止する $ sudo systemctl stop nginx $ sudo certbot certonly --standalone -d example.com $ sudo systemctl start nginx # 通常はこちら(nginxモード)を使う。停止不要 $ sudo certbot --nginx -d example.com
「DNS resolution failed」でドメインが解決できない
DNSのAレコードがまだ反映されていない場合や、設定が間違っている場合に発生します。# サーバー上からドメインのIPアドレスを確認する $ dig example.com +short 203.0.113.10 # pingでも確認できる $ ping -c 1 example.com PING example.com (203.0.113.10) 56(84) bytes of data. 64 bytes from 203.0.113.10: icmp_seq=1 ttl=64 time=0.5 ms
digコマンドで表示されるIPアドレスが自分のVPSのIPアドレスと一致していれば、DNSは正しく設定されています。一致しない場合は、ドメイン管理画面でAレコードを確認してください。DNSの反映には最大で24時間かかる場合があります。「The certificate is not yet due for renewal」が表示される
証明書の有効期限がまだ十分残っている(30日以上)場合に表示されます。エラーではなく正常な動作です。期限が30日以内になると自動的に更新処理が実行されます。SSL証明書設定のまとめ
| やること | コマンド |
|---|---|
| certbotのインストール(snap) | sudo snap install --classic certbot |
| パスを通す | sudo ln -s /snap/bin/certbot /usr/bin/certbot |
| Nginxに証明書を取得・設定 | sudo certbot --nginx -d ドメイン名 |
| 取得した証明書一覧を確認 | sudo certbot certificates |
| 自動更新のテスト | sudo certbot renew --dry-run |
| 自動更新タイマーの確認 | sudo systemctl status snap.certbot.renew.timer |
| HTTPS接続の確認 | curl -I https://ドメイン名 |
certbot renew --dry-runで更新テストを必ず行ってから本番運用に移りましょう。【重要】証明書の自動更新が失敗した場合、Webサイトが「NET::ERR_CERT_DATE_INVALID」などのエラーを表示するようになり、訪問者が全員アクセスできなくなります。
certbot renew --dry-runが成功していても、実際の更新時に失敗するケースがあるため、/var/log/letsencrypt/letsencrypt.logを定期的に確認する習慣を身につけておきましょう。次のステップとして、opensslコマンドによる証明書の詳細確認や、Nginxのアクセスログ解析、ファイアウォールの詳細設定を学ぶと、サーバー運用の幅が広がります。
Linux学習をさらに深めるための関連記事
HTTPS設定ができたら、次はLinuxのコマンド操作やサーバー管理の実践的な知識を深めていきましょう。・opensslコマンドでSSL/TLS証明書を確認する方法|有効期限・暗号スイート・接続テストも
・systemctlコマンドの使い方|サービスの起動・停止・自動起動設定
・firewall-cmdコマンドでポートを開放・管理する方法|ゾーン・サービス・永続化の使い分け
・crontabコマンドの設定と書き方|動かない時のログ確認まで
・logrotateでLinuxのログを自動ローテーションする方法|設定ファイルの書き方とトラブル対処
・curlコマンドでHTTP通信を行う方法|GET・POSTやヘッダー確認も
・grepコマンドで文字列を検索する方法|複数ファイルやディレクトリ除外も
無料の「Linuxサーバー構築入門マニュアル(図解60ページ)」をプレゼントしています。
コマンドを「なんとなく打つ」段階から卒業したい方は、ぜひ受け取ってみてください。
無料マニュアルを受け取る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:WSL2でWindowsのシェルスクリプトが動かない原因|改行コード(CRLF・LF)の違いとdos2unixで解決する方法
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます