初心者でも安心!ssl・nginx・letsencrypt導入全手順完全解説

目次

はじめに

概要

本ドキュメントは、Let’s Encryptの無料SSL証明書を使ってNginxでHTTPSを有効化する具体的な手順を分かりやすく示します。証明書の発行からNginx設定、更新の自動化まで一連の作業を順を追って解説します。初めて扱う方でも進められるよう、具体例と注意点を交えて説明します。

誰向けか

  • 自分でサーバーを運用するエンジニアや個人のサイト管理者
  • HTTPS化を初めて行う方や手順を確認したい方

本書で得られること

  • certbotの導入方法と基本的な使い方が分かります。
  • 自動設定と手動設定の違いが分かり、それぞれの手順を実行できます。
  • Nginxに必要な設定例(証明書の読み込み、リダイレクト、セキュリティ向上)が学べます。

注意点

  • Let’s Encryptはドメイン名の所有確認が必要です。例として、example.comのDNSやサーバー設定を事前に確認してください。
  • 本書はNginxを前提にしています。別のWebサーバーを利用する場合は設定方法が異なります。

Let’s EncryptとNginxで何ができるのか

概要

Let’s Encryptは無料でブラウザが信頼するSSL/TLS証明書を発行するサービスです。Nginxと組み合わせると追加費用なしでHTTPSを有効化できます。証明書は自動で取得・更新できるため、手動で期限を気にする必要が減ります。

主な利点(具体例つき)

  • 無料で正式な証明書を取得できます。例: example.com に対して有効な証明書を発行。
  • 自動更新で有効期間を維持します。certbotを入れておくと数ヶ月ごとの更新を自動で行います。
  • Nginxに組み込めば https://example.com で安全にアクセスできます。設定はssl_certificateのパスを指定するだけです。
  • 複数ドメインやサブドメインにも対応します。例: example.com と www.example.com を同時に発行可能。
  • ワイルドカード証明書(*.example.com)はDNSを使った確認で取得できます。これで多くのサブドメインを一括管理できます。

動作の仕組み(簡単に)

Let’s EncryptはACMEという仕組みでドメイン所有を確認します。代表的な確認方法はHTTP(サーバに一時ファイルを置く)とDNS(特定のTXTレコードを追加する)です。certbotなどのツールがこのやり取りを自動で行い、証明書を取得してNginxの設定に渡します。

導入時の注意点

  • サーバが80番(HTTP)または443番(HTTPS)ポートで外部から接続できる必要があります。
  • DNSが正しく設定されていることを確認してください。

簡単なコマンド例: certbot –nginx -d example.com -d www.example.com
この一行で証明書の取得とNginxの基本設定注入が自動で行われます。

前提条件・準備しておくもの

概要

Let’s Encryptで証明書を取得する前に、事前に揃えておくものを整理します。準備が不足すると発行や自動更新が失敗しますので、順に確認してください。

主な前提条件

  • 独自ドメインを取得済みであること(例: example.com)
  • ドメインのDNSが対象サーバのグローバルIPを指していること
  • Linux + Nginxがインストールされていること(Debian/Ubuntu/Amazon Linux等)
  • HTTP(80番)で外部からアクセス可能であること(http-01チャレンジに必要)

DNSの確認方法(例)

  • digやnslookupでAレコードを確認:dig example.com A
  • ブラウザやcurlでルートにアクセス:curl -I http://example.com

サーバ側の準備

  • Nginxが稼働しているか確認:sudo systemctl status nginx
  • 80番が開いているか確認:sudo ss -tuln | grep :80
  • ファイアウォール(ufw, firewalld, AWSのセキュリティグループ等)で80番を許可する

権限とユーザー

  • 証明書発行時はroot権限またはsudoが必要です。自動更新でcronやsystemdタイマーを使う場合は権限設定に注意してください。

よくある落とし穴と対応

  • DNS浸透(公開されるまで時間がかかる)→ 反映を待つ
  • 80番を別アプリが占有している→ Nginxの設定を見直す

以上を満たしておけば、第4章以降の手順にスムーズに進めます。

certbotのインストール

概要

Let’s Encryptの証明書の発行・更新にはcertbotがよく使われます。ここでは代表的なインストール手順を分かりやすく説明します。環境に合わせてaptかsnapを選んでください。

Debian/Ubuntu(apt)での手順

  1. パッケージリストを更新してからインストールします。
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
  1. nginxを使わない場合はpython3-certbot-nginxは不要です。Apacheならpython3-certbot-apacheを使います。

snapによるインストール(推奨)

snap版は最新が手に入りやすいので推奨です。既にapt版がある場合は削除してから実行します。

sudo apt remove certbot -y
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

GCPの例

GCPの仮想マシンで一気に入れる例です。

sudo apt update
sudo apt install nginx certbot python3-certbot-nginx -y

インストール後の確認と自動更新の確認

  • バージョン確認: certbot --version
  • 動作確認(更新テスト): sudo certbot renew --dry-run

certbotは自動更新機能を持ちます。dry-runで問題ないことを確認してください。ポート80/443が外部から到達可能かも合わせて確認してください。

証明書の発行方法(自動設定/手動設定)

概要

certbotはNginxプラグインで発行から設定まで自動化できます。必要に応じて証明書だけを取得し、あとで手動でNginxに組み込むことも可能です。

自動設定(推奨)

コマンド: sudo certbot --nginx
このコマンドはNginxのserver_nameを読み取り、Let’s Encryptへ証明書を要求します。成功するとcertbotがnginx設定に必要なSSLブロックを追記し、Nginxを再読み込みします。対話形式でドメイン選択やHTTP→HTTPSのリダイレクト設定を聞かれます。事前にNginxが起動し、ポート80が外部から到達可能であることを確認してください。テストは--dry-runで行えます。

手動設定(証明書のみ)

コマンド例: sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
Webroot方式はサイトの公開ディレクトリに.well-known/acme-challenge/へ一時ファイルを置きます。HTTPでそのファイルにアクセスできれば認証が通り、証明書が発行されます。

発行後の証明書ファイル例:
/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem
これらをNginxのssl_certificatessl_certificate_keyに指定してからNginxを再読み込みしてください。

更新と注意点

更新はsudo certbot renewで行います。自動更新用のcronやsystemdタイマーを有効化しておくと便利です。ファイアウォールで80番が塞がれていると失敗します。秘密鍵の権限は厳しく(通常600)保ってください。

NginxへのSSL設定の書き方

概要

証明書を発行したら、Nginxの設定ファイルにSSL設定を追加してHTTPSを有効化します。ここでは基本的な設定例と、注意点、テスト方法を分かりやすく説明します。

基本のHTTPSサーバブロック(例)

server {
  listen 443 ssl http2;
  server_name example.com www.example.com;

  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  root /var/www/html;
  index index.html index.php;
  # 他の設定(location など)をここに書きます
}

ファイルパスはcertbotが発行した場所(/etc/letsencrypt/live/ドメイン/)を指定します。

HTTPからHTTPSへのリダイレクト(例)

server {
  listen 80;
  server_name example.com www.example.com;
  return 301 https://$host$request_uri;
}

すべてのアクセスを恒久的にHTTPSへ転送します。

推奨と注意点

  • ssl_protocolsでTLS1.2以上を有効にします。TLS1.0/1.1は無効にしてください。
  • 強い暗号スイートを使いますが、互換性が必要な場合は調整してください。
  • dhparamを使う場合はssl_dhparam /etc/ssl/certs/dhparam.pem;
  • 証明書のファイル権限はrootのみ読み取りにしておくと安全です。

設定反映と動作確認

  1. 設定の構文チェック: nginx -t
  2. 問題なければ再読み込み: systemctl reload nginx
  3. ブラウザでhttps://ドメイン にアクセスして証明書が正しく当たっているか確認します。

証明書更新後はNginxを再読み込みする必要があります。certbotのrenew時にリロードするフックを設定すると自動化できます。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次