LinuxでSSL証明書を設定する入門|Let's EncryptとcertbotでNginxをHTTPS対応にする方法

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)【Linux入門】初心者のための基礎知識・講座 > LinuxでSSL証明書を設定する入門|Let's EncryptとcertbotでNginxをHTTPS対応にする方法
「自分のサイトを開いたら『この接続は安全ではありません』と表示されてしまった」
「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日後に証明書が切れてサイトにアクセスできなくなる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

SSLとHTTPSとは何か?Linuxサーバーに必要な理由

Webブラウザとサーバーの間でやりとりされるデータは、そのままでは第三者に見られてしまう可能性があります。これを防ぐのがSSL(Secure Sockets Layer)の暗号化技術で、HTTPSはSSLで保護されたHTTP通信のことです。

アドレスバーに「https://」と表示されるサイトはSSL証明書が設定されており、「http://」のままのサイトにはChromeやFirefoxが「この接続は安全ではありません」と警告を出します。

項目 HTTP HTTPS
通信の暗号化 なし あり(SSL/TLS)
ブラウザの表示 「安全ではない」と警告表示 鍵アイコン表示
SEO(Google評価) 不利 有利
使用ポート番号 80番 443番
VPSでNginxを動かし始めた段階では、デフォルトがHTTP(80番ポート)になっています。本番運用する前に、HTTPS(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

ポート80と443の両方が開いていることを確認したら、次のステップへ進みます。

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

「Congratulations!」と表示されれば成功です。certbotが自動的にNginxの設定ファイルを書き換え、ポート443でSSLが有効になります。また、ポート80(HTTP)へのアクセスは自動的にポート443(HTTPS)にリダイレクトされるようになります。

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

「VALID: 89 days」のように表示されれば、証明書が正常に機能しています。

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

「active (waiting)」と表示されていれば、自動更新が有効な状態です。

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) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

「Congratulations, all simulated renewals succeeded」と表示されれば、自動更新の設定は問題ありません。

よくあるエラーと対処法

「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://ドメイン名
SSL証明書の設定で最も大切なのは、取得後に自動更新の動作確認をしておくことです。「証明書は取れたけど、90日後に切れてサイトが表示されなくなった」というケースは実際によく見かけます。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サーバー構築の「型」を体系的に身につけたい方へ、
無料の「Linuxサーバー構築入門マニュアル(図解60ページ)」をプレゼントしています。
コマンドを「なんとなく打つ」段階から卒業したい方は、ぜひ受け取ってみてください。
無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。