ブラウザのアドレスバーに表示される「🔒 保護された通信」と「⚠ 保護されていない通信」の違い、気にしたことはありますか?この違いを生み出しているのがSSL/TLS証明書です。そして現在、この証明書を完全無料で取得・設定できるのがLet’s Encrypt(レッツエンクリプト)です。
この記事では、SSL/TLSの仕組みをゼロから理解し、Let’s EncryptとCertbotを使って実際にサーバをHTTPS化する手順を、初心者でも迷わないよう丁寧に解説します。前回の「サーバの立ち上げ方・構成」記事の続きとして読むと、より理解が深まります。
📌 目次
- SSL/TLSとは何か?なぜ必要か?
- HTTPとHTTPSの違いを図解で理解する
- SSL証明書の種類と選び方
- Let’s Encryptとは?なぜ無料なのか?
- 【事前準備】HTTPS化に必要なもの
- 【実践】Certbotのインストールと証明書の取得手順
- 【実践】Nginx / Apache への設定方法
- 証明書の自動更新を設定する
- HTTPS化後のセキュリティ強化設定
- よくあるエラーと対処法
- まとめ:セキュリティの視点から見た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_certificate・ssl_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/tcp & systemctl 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)


コメント