【無料ツール】画像をPDFに変換するPhotoPDF Appを公開しました!

【Nginx講座 第5回】HTTPS化とHTTP/3(QUIC)。Let’s EncryptでのSSL証明書自動更新

「保護されていない通信」と表示されるサイトを、あなたは信頼しますか?

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、リバースプロキシとロードバランシングを構築し、Webアプリケーションを公開する準備が整いました。

しかし、ブラウザのアドレスバーを見てください。
http://... の横に、「保護されていない通信(Not Secure)」という不穏な警告が出ていませんか?
今の時代、通信を暗号化しない(HTTPのままにする)ことは、ユーザーの個人情報を危険に晒すだけでなく、Google検索の順位も下がり、誰も寄り付かないサイトになってしまうことを意味します。

コウ君

先生、それは困ります!
でも、SSL証明書って年間数万円くらいかかるイメージがあって…。
個人開発のアプリとか、テスト用のブログにそんなコストかけられないですよ。
あと、最近ニュースで見た「HTTP/3」っていうのも気になってます。なんか速いらしいですけど、設定が難しそうで。

リナックス先生

心配無用よ。
今は「Let’s Encrypt」を使えば、誰でも無料で、しかも全自動でSSL証明書を取得・更新できるの。
さらに、第1回で「Mainline版」をインストールした私たちは、最新の「HTTP/3 (QUIC)」も簡単な設定追加だけで使えるわ。
セキュリティと爆速表示、両方を手に入れて、プロ顔負けの配信環境を作りましょう!

本記事では、無料SSL証明書「Let’s Encrypt」の導入と自動更新設定(Certbot)、セキュリティ強度を高めるためのTLS設定、そして次世代プロトコル HTTP/3 (QUIC) の有効化手順までを徹底解説します。

🚀 Nginx基本講座(全8回)カリキュラム

現在地:【第5回】HTTPS化とHTTP/3(QUIC)。Let’s EncryptでのSSL証明書自動更新


第1章:HTTPS化の仕組みとLet’s Encrypt

作業に入る前に、仕組みを少しだけ理解しておきましょう。

なぜHTTPSが必要なのか?

  1. 暗号化: 通信内容(パスワードやクレカ情報)を盗聴から守る。
  2. 真正性: 「このサイトは偽物(フィッシングサイト)ではない」ことを証明する。
  3. SEO評価: GoogleはHTTPS化されたサイトを検索順位で優遇する。
  4. 新機能の前提: HTTP/2やHTTP/3、PWA、Service Workerなどの最新技術は、HTTPSが必須要件です。

Let’s Encryptとは?

MozillaやCiscoなどが支援する、非営利の認証局(CA)です。
「ドメインの使用権を持っていること」を自動プログラムで検証する(Domain Validation)ことで、無料かつ無制限にSSL証明書を発行してくれます。
有効期限は90日と短いですが、更新も自動化できるため、実質的にメンテナンスフリーで運用できます。


第2章:Certbotの導入と証明書取得

Let’s Encryptの証明書を取得・設定するための公式ツール「Certbot(サートボット)」をインストールします。
※ここではAlmaLinux 9を前提としますが、他のOSでも手順は似ています。

ステップ1:Certbotのインストール

Certbot公式サイトでは snapd を使ったインストールが推奨されています。
依存関係のトラブルを避けるため、推奨通りSnapを使います。

# EPELリポジトリの追加(必要な場合)
sudo dnf install epel-release -y

# snapdのインストールと有効化
sudo dnf install snapd -y
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap

# (重要)Snapの更新まで少し待つか、一度ログアウト&ログインする

# Coreのインストール
sudo snap install core
sudo snap refresh core

# Certbotのインストール
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

ステップ2:証明書の取得とNginx設定の自動更新

Certbotには「Nginxプラグイン」があり、これを使うとNginxの設定ファイルを自動で書き換えてSSL対応にしてくれます。
初心者はまずこの機能を使うことを強くおすすめします。

sudo certbot --nginx

実行すると、いくつか質問されます。

  1. Enter email address: 緊急連絡用メールアドレスを入力。
  2. Terms of Service: 利用規約に同意(Y)。
  3. Share Email: メールアドレスをパートナーに公開するか(NでOK)。
  4. Which names would you like to activate HTTPS for?: ドメインの選択肢が出るので、SSL化したいドメインの番号を入力。

成功すると、Congratulations! と表示され、証明書が保存されます。
さらに、Nginxの設定ファイル(/etc/nginx/conf.d/example.confなど)が自動的に書き換わり、リロードまで完了しています。


第3章:NginxのSSL設定詳細とHSTS

自動設定は便利ですが、プロなら「何が書き換わったか」を確認し、さらにセキュリティを高めるチューニングを行いましょう。

自動設定された中身の確認

設定ファイルを開いてみてください。

server {
    listen 443 ssl; # managed by Certbot
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
    
    ...
}

# managed by Certbot というコメント付きで、証明書のパスなどが追記されています。
また、80番ポート(HTTP)へのアクセスを443番(HTTPS)へリダイレクトする設定も自動追加されているはずです。

プロのチューニング:HSTSの設定

セキュリティをさらに高めるために、HSTS (HTTP Strict Transport Security) を設定します。
これはブラウザに対して「このサイトには今後、絶対にHTTPでアクセスしないで。強制的にHTTPSにして」と命令するヘッダーです。

server {
    listen 443 ssl;
    ...
    # HSTS有効化(1年間有効、サブドメイン含む)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}

注意: これを設定すると、証明書の更新を忘れた際にユーザーがアクセスできなくなります(警告を無視して進むこともできなくなります)。自動更新が確実に動くことを確認してから有効化してください。

💡 Mozilla SSL Configuration Generator
暗号化スイート(ssl_ciphers)などの設定は非常に複雑で、古いブラウザへの対応とセキュリティ強度のバランスを取るのが難しいです。
Mozillaが提供するツール SSL Configuration Generator を使えば、Nginxのバージョンを選ぶだけで、その時点での「ベストプラクティス設定」を生成してくれます。
プロはこれを使って設定ファイル(options-ssl-nginx.conf)を最新化します。


第4章:証明書の自動更新設定

Let’s Encryptの最大の弱点は「有効期限が90日しかない」ことです。
手動更新は絶対に忘れるので、自動化は必須です。
CertbotをSnapでインストールした場合、実は自動更新タイマーが既に設定されています。

自動更新の確認

systemctl list-timers

この中に snap.certbot.renew.timer があれば、自動更新が有効になっています。

更新テスト(Dry Run)

念のため、本当に更新できるかテスト(リハーサル)を行います。

sudo certbot renew --dry-run

エラーが出なければOKです。

更新後のNginxリロード設定

証明書ファイルが更新されても、Nginxがそれを再読み込み(Reload)しないと、古い証明書を使い続けてしまいます。
Certbotに「更新成功時にNginxをリロードする」フックを設定します。

/etc/letsencrypt/renewal-hooks/post/ ディレクトリにスクリプトを置くか、以下のコマンドで設定ファイルを更新します。

しかし、--nginx プラグインを使っている場合は、通常自動的にリロードも処理してくれます。
明示的に設定したい場合は、/etc/letsencrypt/renewal/ドメイン.conf[renewalparams] セクションに以下を追記します。

renew_hook = systemctl reload nginx

第5章:爆速プロトコル「HTTP/3 (QUIC)」の導入

いよいよ本日のメインディッシュ、HTTP/3 です。
従来のHTTP/1.1やHTTP/2は「TCP」を使っていましたが、HTTP/3は「UDP (QUIC)」を使います。
これにより、通信の確立が爆速になり、パケットロス時の遅延も解消されます。

前提条件

  • Nginxバージョン: 1.25.0以上(Mainline版ならOK)
  • SSL証明書: 取得済みであること
  • ファイアウォール: UDPの443番ポートが開いていること

ステップ1:UDPポートの開放

HTTP/3はUDPを使うため、Firewallで許可する必要があります。

sudo firewall-cmd --permanent --add-port=443/udp
sudo firewall-cmd --reload

ステップ2:Nginx設定ファイルの変更

SSL設定済みの server ブロックを編集します。

server {
    # 既存のTCP 443設定
    listen 443 ssl;
    
    # 【追加】UDP 443 (QUIC) 設定
    listen 443 quic reuseport;

    # 証明書設定(既存のまま)
    ssl_certificate ...;
    ssl_certificate_key ...;
    
    # 【追加】TLS 1.3の有効化(QUICには必須)
    ssl_protocols TLSv1.2 TLSv1.3;

    # 【追加】Alt-Svcヘッダーの送信
    # ブラウザに「このサイトはHTTP/3に対応してるよ」と教える
    add_header Alt-Svc 'h3=":443"; ma=86400';

    # 【追加】QUIC用のヘッダーを追加(任意)
    add_header X-protocol $server_protocol always;

    location / {
        # 通常の設定
        ...
    }
}

解説:
listen 443 quic reuseport; がHTTP/3を待ち受ける設定です。
Alt-Svc (Alternative Service) ヘッダーを送ることで、最初はTCPで接続してきたブラウザに対し、「次はUDP(h3)で接続してね」と案内します。

ステップ3:動作確認

Nginxを再起動した後、Chromeなどのブラウザでサイトにアクセスします。
開発者ツールの「Network」タブを開き、「Protocol」列を確認してください。
「h3」と表示されていれば、HTTP/3での接続成功です!


第6章:トラブルシューティング

HTTPS化でよくあるトラブルです。

1. Mixed Content(混合コンテンツ)エラー

HTTPSサイトの中に、http:// で始まる画像やスクリプトが混ざっていると、ブラウザがブロックします。
HTML内のリンクをすべて https:// または //(プロトコル相対パス)に書き換える必要があります。
WordPressの場合は「Really Simple SSL」プラグインなどで一発修正できます。

2. HTTP/3にならない

  • ブラウザの問題: 初回アクセスはTCPになることが多いです。何度かリロードしてみてください。
  • UDPポート: クラウド(AWS/GCP/VPS)を使っている場合、OSのFirewallだけでなく、クラウド側のセキュリティグループ(ファイアウォール)でも UDP 443 を許可する必要があります。これを忘れがちです。

まとめ:セキュリティと速度は両立できる

お疲れ様でした!
今回は、Webサイトの信頼性を担保するHTTPS化と、最新技術HTTP/3の導入を行いました。

今回の重要ポイント:

  • Let’s Encrypt (Certbot) を使えば、無料で全自動HTTPS化が可能。
  • certbot --nginx は便利だが、中身を理解して使うこと。
  • HTTP/3 (QUIC) は listen 443 quic とUDPポート開放で実現できる。
  • 自動更新(renew)のテストは必ず行うこと。

これで、あなたのWebサーバーは「安全」かつ「爆速」な通信環境を手に入れました。
しかし、公開サーバーには悪意ある攻撃者が常に狙っています。
「特定の国からのアクセスを拒否したい」「パスワードを知っている人だけに見せたい」「短時間に大量アクセスしてくる攻撃(DDoS)を防ぎたい」。

次回、第6回は「鉄壁の守り。アクセス制限、Basic認証、Rate LimitingによるDDoS対策」です。
Nginxの標準機能だけでできる強力なセキュリティ対策を網羅します。
大切なサーバーを守るための盾を用意しましょう。お楽しみに!

▼ Nginxの実践環境を手に入れる ▼

HTTP/3を試すなら
「VPS」で自分専用環境

おすすめVPSを見る

セキュリティ知識を仕事に
「ITエンジニア転職」

転職エージェントを見る

コメント