【完全無料】Let’s EncryptでHTTPS化する全手順|初心者でもわかるSSL/TLS証明書の設定

解析

ブラウザのアドレスバーに表示される「🔒 保護された通信」「⚠ 保護されていない通信」の違い、気にしたことはありますか?この違いを生み出しているのがSSL/TLS証明書です。そして現在、この証明書を完全無料で取得・設定できるのがLet’s Encrypt(レッツエンクリプト)です。

この記事では、SSL/TLSの仕組みをゼロから理解し、Let’s EncryptとCertbotを使って実際にサーバをHTTPS化する手順を、初心者でも迷わないよう丁寧に解説します。前回の「サーバの立ち上げ方・構成」記事の続きとして読むと、より理解が深まります。


📌 目次

  1. SSL/TLSとは何か?なぜ必要か?
  2. HTTPとHTTPSの違いを図解で理解する
  3. SSL証明書の種類と選び方
  4. Let’s Encryptとは?なぜ無料なのか?
  5. 【事前準備】HTTPS化に必要なもの
  6. 【実践】Certbotのインストールと証明書の取得手順
  7. 【実践】Nginx / Apache への設定方法
  8. 証明書の自動更新を設定する
  9. HTTPS化後のセキュリティ強化設定
  10. よくあるエラーと対処法
  11. まとめ:セキュリティの視点から見たHTTPSの重要性

① SSL/TLSとは何か?なぜ必要か?

SSL(Secure Sockets Layer)およびTLS(Transport Layer Security)は、インターネット上の通信を「暗号化」するためのプロトコル(通信規格)です。

現在は技術的にSSLは古いバージョンであり、実際に使われているのはTLSですが、歴史的な経緯から「SSL証明書」「SSL化」という言葉が今でも広く使われています。

🔓 暗号化がないと何が起きるのか?

HTTPで通信している場合、あなたがWebサイトに送信するデータは「平文(ひらぶん)」、つまり暗号化されていない生のテキストとして流れます。

たとえば、カフェのWi-Fiを使ってHTTPのサイトでパスワードを入力したとします。同じWi-Fiネットワークにいる悪意ある第三者がパケットキャプチャ(通信の傍受)ツール(Wiresharkなど)を使えば、あなたのパスワードを丸ごと見ることができてしまいます。

通信方式 通信内容の見え方 リスク
HTTP(暗号化なし) password=mypassword123 と丸見え 盗聴・改ざん・なりすましが可能
HTTPS(TLS暗号化あり) ランダムな文字列に変換されて見えない 傍受されてもほぼ解読不可能

FACT:HTTPSの普及状況

Googleの透明性レポート(2024年時点)によれば、Chromeブラウザで読み込まれるページの95%以上がHTTPSとなっています。また、Googleは2014年からHTTPSをSEO(検索順位)の評価指標に含めており、HTTPのままのサイトは検索結果で不利になります。さらにGoogle Chrome・Firefox・Safariはすべて、HTTPのページに対して「保護されていない通信」という警告を表示するようになっています。

🚨 重要

Googleは2023年以降、HTTPのサイトに対してChromeブラウザで赤い「保護されていない通信」警告を強化し続けています。WordPressなどのCMSを使ったサイト、個人ブログ、ECサイトを問わず、HTTPのままサービスを続けることはSEO・信頼性・ユーザー離脱のすべての面でリスクになります。HTTPS化は今やオプションではなく必須です。


② HTTPとHTTPSの違いを図解で理解する

🔓 HTTP通信の流れ(危険)

HTTP通信では、あなたのブラウザとサーバの間でやり取りされるデータが、ネットワーク経由でそのまま(生のテキストで)流れます

【あなたのブラウザ】──生テキスト──▶【インターネット(傍受可能)】──▶【Webサーバ】

途中で第三者に見られても、データは「username=taro&password=abc123」のように読めてしまいます。

🔒 HTTPS通信の流れ(安全)

HTTPS(TLS)通信では、まず「TLSハンドシェイク」と呼ばれる「鍵の交換」が行われます。この後、すべての通信データが暗号化されます。

【あなたのブラウザ】──暗号化データ──▶【インターネット(傍受されても解読不可)】──▶【Webサーバ】

TLSハンドシェイクの仕組み(超簡単版)

ステップ 何が起きているか わかりやすいたとえ
①ClientHello ブラウザが「対応している暗号化方式の一覧」をサーバに送る 「僕は日本語・英語・フランス語が話せます」と自己紹介
②ServerHello サーバが「では〇〇方式で話しましょう」と返答+SSL証明書を送る 「では英語で話しましょう」+「私はXXXサーバです(証明書提示)」
③証明書の検証 ブラウザが証明書の正当性を信頼できる第三者機関(CA)に確認する 「この人が提示した身分証が本物か警察に確認する」
④鍵の生成 共通の暗号化鍵を両者で生成する(第三者には知られない) 「今日のパスワードは〇〇にしましょう」と2人だけで決める
⑤暗号化通信開始 以降の通信はすべて暗号化される 2人だけの暗号で会話開始

③ SSL証明書の種類と選び方

SSL/TLS証明書にはいくつかの種類があり、用途によって選ぶものが変わります。

証明書の種類 検証レベル 取得難易度 費用 向いている用途
DV(ドメイン認証) ドメインの所有権のみ確認 ★☆☆(簡単・自動化可) 無料〜数千円/年 個人ブログ・中小サイト
OV(組織認証) ドメイン+組織の実在確認 ★★★(書類提出が必要) 数万円/年〜 企業サイト・中規模サービス
EV(拡張認証) 組織の厳格な審査(法的実在) ★★★★★(最も厳格) 数万〜十数万円/年 金融機関・大手ECサイト
ワイルドカード証明書 サブドメインも一括でカバー ★★☆(やや複雑) 数千円〜数万円/年 サブドメインが多いサービス
マルチドメイン証明書(SAN) 複数の異なるドメインを1枚でカバー ★★★ 数万円/年〜 複数ドメインを管理する企業

Let’s Encryptが提供するのはDV証明書です。個人ブログ・ポートフォリオサイト・小〜中規模のWebサービスには十分な証明書であり、暗号化の強度はOV・EVと同等です。

⚠ 注意

「無料だから信頼性が低い」というのは誤解です。Let’s EncryptのDV証明書は、暗号化の品質においてOV・EVと差はありません。ただし、「この組織が実際に存在するか」「法的に認められた団体か」という組織の実在証明はDV証明書では行われません。金融機関・決済サービス・医療情報を扱う場合はOV/EV証明書を検討してください。


④ Let’s Encryptとは?なぜ無料なのか?

Let’s Encryptは、Internet Security Research Group(ISRG)という非営利団体が運営する認証局(CA:Certificate Authority)です。2015年にサービスを開始し、現在は世界で3億5千万件以上のドメインに証明書を発行しています(2024年時点、Let’s Encrypt公式統計)。

なぜ無料で提供できるのか?

  • 非営利団体による運営:Cisco、Mozilla、EFF(電子フロンティア財団)、Google、Amazon Web Servicesなどの大手企業・団体がスポンサーとして資金援助している
  • 自動化による低コスト:証明書の発行・更新が完全に自動化(ACME プロトコルを使用)されているため、人的コストがほぼゼロ
  • 「インターネット全体を安全にする」というミッション:商業的な利益ではなく、公共の利益を目的とした活動

Let’s Encryptの証明書の特徴

項目 内容
費用 完全無料
証明書の種類 DV(ドメイン認証)証明書
有効期限 90日間(自動更新で実質永続利用可能)
ワイルドカード対応 対応(DNS-01チャレンジが必要)
主なクライアントツール Certbot(公式推奨)
対応プロトコル TLS 1.2 / TLS 1.3
⚠ 注意

Let’s Encryptの証明書は有効期限が90日間です。更新を忘れると証明書が失効し、ブラウザで「このサイトへの接続は安全ではありません」という赤い警告画面が表示されます。これを防ぐため、必ず自動更新(Certbot自動更新)を設定してください。本記事の手順通りに設定すれば自動化できます。


⑤ 【事前準備】HTTPS化に必要なもの

証明書の取得を始める前に、以下が揃っているかを確認してください。

必要なもの 説明 確認方法
独自ドメイン 例:yourdomain.com(Let’s EncryptはIPアドレス単体には非対応) お名前.com・ムームードメイン等で取得済みであること
DNSの設定完了 ドメインのAレコードがサーバのIPアドレスを指していること nslookup yourdomain.com でIPが返ってくることを確認
Webサーバの起動 ApacheまたはNginxが動作していること systemctl status nginx または systemctl status apache2
80番・443番ポートの開放 ファイアウォールで80(HTTP)と443(HTTPS)を許可 sudo ufw status で80/tcp・443/tcpが「ALLOW」になっているか確認
sudo権限を持つユーザー 管理者コマンドを実行できるアカウント sudo whoami で「root」が返ってくればOK

ポートを開放する(まだの場合)

UFWファイアウォールを使っている場合:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload

✅ 対策済み確認

DNS設定後、変更が世界中のDNSサーバに反映されるまで最大72時間かかる場合があります(TTL設定による)。Certbotによる証明書取得はDNSが正しく反映されていないと失敗します。nslookup yourdomain.com または dnschecker.org で確認してから作業を進めましょう。


⑥ 【実践】Certbotのインストールと証明書の取得手順

Let’s Encryptの公式推奨クライアントはCertbot(サートボット)です。Certbotを使えば、コマンド1〜2本でSSL証明書の取得からWebサーバへの自動設定まで完了します。

Ubuntu Server 22.04(Nginx)の場合

STEP 1:Certbotのインストール

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

(Apacheの場合は python3-certbot-apache をインストールしてください)

STEP 2:証明書の取得

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

yourdomain.com の部分は自分のドメインに置き換えてください。www. あり・なしの両方を指定することを推奨します。

STEP 3:対話形式の設定入力

コマンドを実行すると、いくつかの質問が表示されます:

表示される質問 入力内容
Enter email address(緊急連絡用メールアドレス) 自分のメールアドレスを入力
Terms of Service に同意するか A と入力してEnter(Agreeの意)
EFFへのメール登録(任意) Y または N どちらでも可
HTTPをHTTPSにリダイレクトするか 2 と入力(Redirect推奨:HTTPアクセスを自動でHTTPSに転送)

STEP 4:成功メッセージの確認

以下のようなメッセージが表示されれば成功です:

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/yourdomain.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/yourdomain.com/privkey.pem

この後、ブラウザで https://yourdomain.com にアクセスして、アドレスバーに🔒マークが表示されることを確認しましょう。

✅ 対策済み確認

Certbot --nginx オプションを使うと、NginxのSSL設定ファイルが自動的に書き換えられます。ssl_certificatessl_certificate_key・HTTPSリダイレクトの設定が自動で追加されるため、手動設定のミスを防げます。設定後は sudo nginx -t で設定ファイルのエラーがないことを確認してください。


⑦ 【実践】Nginx / Apache への設定方法

Nginx の設定ファイルを確認する

Certbotが自動設定した後、Nginxの設定ファイルは以下のように変更されています:

設定ファイルの場所:/etc/nginx/sites-available/yourdomain.com

自動設定後の主要な内容(Certbotが追記する主要部分):

listen 443 ssl; ← HTTPSポートで待ち受け
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf; ← 推奨SSL設定を読み込み

Apache の場合

Apacheの場合は以下のコマンドで証明書を取得します:

sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d yourdomain.com -d www.yourdomain.com

ApacheもCertbotが /etc/apache2/sites-available/ の設定ファイルを自動更新します。

証明書ファイルの構成

ファイル名 内容 役割
fullchain.pem サーバ証明書 + 中間証明書 Webサーバが提示する証明書チェーン
privkey.pem 秘密鍵(プライベートキー) 暗号化に使う非公開の鍵。絶対に外部に漏らしてはいけない
cert.pem サーバ証明書のみ 一部のソフトウェアで単体使用
chain.pem 中間証明書のみ CAへの証明書チェーン
🚨 重要

privkey.pem(秘密鍵)は絶対に外部に公開しないでください。この鍵が漏洩すると、攻撃者はあなたのサーバになりすますことができ、通信を傍受・改ざんできてしまいます。秘密鍵ファイルのパーミッションは自動的に600(所有者のみ読み取り可)に設定されています。バックアップする際も暗号化した状態で保管しましょう。


⑧ 証明書の自動更新を設定する

Let’s Encryptの証明書は有効期限が90日のため、定期的に更新が必要です。Certbotをインストールすると自動更新の仕組みが自動で設定される場合がありますが、確認と手動テストを必ず行いましょう。

自動更新の確認方法

Certbotはインストール時にsystemdタイマーまたはcronジョブを設定します。

systemdタイマーの確認:

sudo systemctl status certbot.timer

「Active: active (waiting)」と表示されれば自動更新は有効です。

自動更新のドライランテスト

実際には更新せず、更新が成功するかどうかだけテストするコマンドです:

sudo certbot renew --dry-run

「Congratulations, all simulated renewals succeeded」と表示されれば問題ありません。

cronによる自動更新設定(systemdタイマーが設定されていない場合)

sudo crontab -e を実行し、以下を追加します:

0 3 * * * /usr/bin/certbot renew --quiet && systemctl reload nginx

これにより毎日午前3時に自動更新チェックが走り、期限が30日以内になった証明書が自動更新されます。

✅ 対策済み確認

Certbotの自動更新は「証明書の有効期限が30日以下になったタイミングで更新処理を実行」します。90日間の有効期限のうち残り30日を切った時点で更新されるため、実質60日ごとに更新が走る計算です。更新後は Nginx/Apache のリロード(systemctl reload nginx)も必ず実行するよう設定してください。リロードしないと新しい証明書が反映されません。


⑨ HTTPS化後のセキュリティ強化設定

証明書を取得してHTTPS化できたら、さらにセキュリティを強化する設定を追加しましょう。

1. HSTS(HTTP Strict Transport Security)の設定

HSTSは、ブラウザに「このサイトは必ずHTTPSでアクセスせよ」と命令するHTTPヘッダーです。一度訪問したブラウザはHTTPへのアクセスを自動的にHTTPSに変換します。

Nginxの設定ファイルに追加:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

2. TLSのバージョンを制限する

古いTLS 1.0・1.1には脆弱性が発見されているため、TLS 1.2以上のみを許可します:

ssl_protocols TLSv1.2 TLSv1.3;

3. セキュリティヘッダーの追加

ヘッダー名 効果 設定例
X-Frame-Options クリックジャッキング攻撃を防ぐ add_header X-Frame-Options "SAMEORIGIN";
X-Content-Type-Options MIMEタイプのスニッフィングを防ぐ add_header X-Content-Type-Options "nosniff";
X-XSS-Protection 反射型XSSを旧ブラウザでブロック add_header X-XSS-Protection "1; mode=block";
Referrer-Policy リファラー情報の漏洩を制限 add_header Referrer-Policy "strict-origin-when-cross-origin";
Content-Security-Policy XSSや不正スクリプト読み込みを防ぐ サイトの構成に合わせて設定(要注意)

4. SSL設定のグレードを確認する

設定後、SSL Labs(ssllabs.com/ssltest/)で無料のSSL品質チェックを実施しましょう。正しく設定されたサーバはA または A+のスコアを取得できます。

✅ 対策済み確認

SSL LabsのテストでAグレード以上を取得できれば、TLSの設定は十分なレベルです。特に「TLS 1.3対応」「HSTS設定済み」「古い暗号スイート(RC4・3DES)の無効化」の3点が評価のポイントになります。Certbotの options-ssl-nginx.conf を読み込む設定を使っていれば、デフォルトでAグレード相当の設定になっています。


⑩ よくあるエラーと対処法

エラーメッセージ・症状 原因 対処法
Connection refused on port 80 WebサーバかUFWが80番ポートをブロックしている sudo ufw allow 80/tcpsystemctl start nginx を確認
DNS problem: NXDOMAIN DNSのAレコードがまだ浸透していないかIPが間違っている dnschecker.orgでDNS浸透を確認。最大72時間待つ
Too many requests(レート制限) 1週間に同一ドメインへの証明書取得が5回を超えた テストは --staging オプションを使う。本番は週1回まで
Certificate has expired(証明書期限切れ) 自動更新が動いていなかった sudo certbot renew を手動実行。cronタイマーを再設定
Mixed Content 警告 HTTPSページ内にHTTP画像・スクリプトが混在している WordPressなら「Really Simple SSL」プラグインで一括修正
NET::ERR_CERT_COMMON_NAME_INVALID 証明書のドメインと実際のURLが一致していない www. あり・なしを両方含めて証明書を取り直す
Nginx test failed(設定ファイルエラー) Certbot自動設定後のNginx設定ファイルに文法エラー sudo nginx -t でエラー箇所を確認して修正
⚠ 注意

Certbotにはレート制限があります。同一ドメインに対して1週間に5回までしか証明書を取得できません。設定テストの際は必ず --staging(ステージング)オプションを付けて実行してください:sudo certbot --nginx --staging -d yourdomain.com。ステージング証明書はブラウザに警告が出ますが、レート制限にカウントされないため何度でもテストできます。


⑪ まとめ:セキュリティの視点から見たHTTPSの重要性

SSL/TLSとLet’s Encryptについて学んだことを振り返りましょう:

テーマ ポイント
SSL/TLSの目的 通信を暗号化し、盗聴・改ざん・なりすましを防ぐ
HTTPとHTTPSの違い HTTPは平文・HTTPSはTLSで暗号化。カフェWi-Fiでも安全
証明書の種類 個人・中小サイトはDV証明書(Let’s Encrypt)で十分
Let’s Encryptの特徴 無料・90日更新・自動化可能・世界3.5億ドメイン以上が採用
Certbotの使い方 コマンド2本でインストール〜証明書取得〜Nginx自動設定が完了
自動更新 systemdタイマーまたはcronで自動化。--dry-runでテスト必須
セキュリティ強化 HSTS・TLS1.2以上・セキュリティヘッダーを追加でA+評価を目指す
✅ 対策済み確認

この記事の手順通りに設定を完了した方は、以下のチェックリストを確認してください。①ブラウザで🔒マークが表示される ②https://でアクセスできる ③http://でアクセスすると自動的にhttps://にリダイレクトされる ④sudo certbot renew --dry-runがエラーなく完了する ⑤SSL Labsのテストで「A」以上を取得——この5つがすべてOKであれば、HTTPS化は完成です。おめでとうございます!

📚 次のステップ:この記事の後に学ぶこと

  • 🔜 Linuxのログ分析基礎:Nginx・Apacheのアクセスログから不正アクセスを検出する
  • 🔜 WAF(Webアプリケーションファイアウォール)の導入:ModSecurity・Cloudflare WAF
  • 🔜 OWASP Top 10:Webアプリの代表的な脆弱性10選と対策
  • 🔜 CSP(Content Security Policy)の設定:XSS対策の最前線
  • 🔜 ペネトレーションテスト入門:自分のサーバを合法的に攻撃して脆弱性を発見する

参考情報・出典:
・Let’s Encrypt 公式統計(letsencrypt.org/stats)2024年時点
・Google Transparency Report「HTTPS encryption on the web」2024年
・Certbot公式ドキュメント(certbot.eff.org)
・SSL Labs「SSL/TLS Deployment Best Practices」
・NIST SP 800-52 Rev.2「Guidelines for the Selection, Configuration, and Use of Transport Layer Security(TLS)Implementations」
・Mozilla SSL Configuration Generator(ssl-config.mozilla.org)

コメント