サイトを無料でHTTPS(鍵マーク)にする方法【Let's Encrypt + certbot 実務ガイド】
本記事はアフィリエイト広告(A8.net)を含みます。価格・仕様は2026年6月時点の目安です。最新は各公式サイトでご確認ください。
TL;DR
ブラウザの鍵マーク(🔒)は、「HTTPS(エイチ・ティー・ティー・ピー・エス)」という通信方式が有効になっている証拠です。HTTPS化に必要な「SSL/TLS証明書」は、Let’s Encrypt(レッツ・エンクリプト) というサービスを使えば無料で取得できます。
設定に使うツールは certbot(サートボット) で、取得から自動更新まで自動化できます。証明書の有効期限は90日ですが、更新は自動化できるので手間はかかりません。
「Cloudflareを使っているけど大丈夫?」 → 大丈夫ですが、Cloudflare側のSSLモード設定を間違えると「鍵マークは付いているのに実は暗号化されていない」状態になります。最後の章で直接説明します。
なぜHTTPS(鍵マーク)が必要なのか
HTTPSの前に、まず「HTTP(エイチ・ティー・ティー・ピー)」を理解してください。
HTTPは、ブラウザとサーバーが情報をやりとりするときの取り決め(プロトコル)です。ただし、普通のHTTPは「平文(ひらぶん)」、つまりそのままの文字列でデータを送ります。ログインのID・パスワード・フォームの入力内容も、同じネットワーク上にいる人には読めてしまいます。
HTTPSは、このHTTP通信を暗号化したものです。「S」は「Secure(セキュア、安全な)」の頭文字です。暗号化することで次の3つのリスクを防ぎます。
- 盗聴: 通信経路で内容を読まれる
- 改ざん: 経路の途中でコンテンツを書き換えられる(広告の差し込みやマルウェア注入)
- なりすまし: 接続先が本物のサーバーかどうかを確認できない
実務上も、HTTPSは事実上の必須になっています。
| 観点 | HTTPSが必要な理由 |
|---|---|
| ブラウザ表示 | 主要ブラウザはHTTPページに「保護されていない通信」と警告を出す |
| SEO | Googleは検索ランキング要因としてHTTPSを評価している |
| 最新API | サービスワーカー・位置情報・HTTP/2などはHTTPS必須 |
| 信頼 | 鍵マークがないサイトはフォーム送信や決済で離脱されやすい |
SSL/TLS証明書とは何か
HTTPS通信の仕組みを担うのが SSL/TLS証明書(エスエスエル/ティーエルエス しょうめいしょ) です。
「SSL」と「TLS」はどちらも通信を暗号化するプロトコルの名前で、現在使われているのは技術的にはTLSです。ただし「SSL証明書」という呼び方が広く定着しているため、この2つは実質的に同じ意味で使われています。
証明書が担う役割は2つあります。
1. 暗号化の土台(鍵交換)
ブラウザとサーバーが接続するとき(TLSハンドシェイクと呼びます)、証明書に含まれる公開鍵を使って「この通信だけで使う暗号の鍵」を安全にやりとりします。以降の通信はその鍵で暗号化されます。
2. 認証(このドメインの正当な持ち主であることの証明)
証明書は 認証局(CA: Certificate Authority) という機関が発行します。認証局は「この証明書の持ち主が、確かにそのドメインを管理している」ことを確認したうえで署名します。
「自己署名証明書じゃダメなの?」 暗号化だけなら、自分で署名した証明書(自己署名証明書)でも可能です。ただし、それではブラウザが「信頼できない証明書」として警告を表示します。ブラウザに信頼してもらうには、ブラウザがあらかじめ信頼している認証局が発行した証明書が必要です。Let’s Encryptはこの「信頼された認証局」のひとつです。
DV・OV・EV とワイルドカード:証明書の種類
証明書には「何をどこまで確認して発行するか」で種類があります。暗号化の強度は変わらず、違いは認証のレベルだけです。
| 種類 | 検証内容 | 発行スピード | 主な用途 |
|---|---|---|---|
| DV(ドメイン認証) | ドメインの所有権のみ | 数分〜自動 | 個人サイト・ブログ・一般的なWebサービス |
| OV(企業認証) | ドメイン所有権+組織の実在性 | 数日 | 企業サイト・問い合わせ窓口 |
| EV(拡張認証) | OVより厳格な法的審査 | 1週間前後 | 金融・大規模ECなど |
Let’s Encryptが発行するのはDV証明書です。個人サイトや業務サーバーなら、DVで十分です。
ワイルドカード証明書
*.example.com のように、サブドメインをまとめて1枚でカバーする証明書をワイルドカード証明書と言います。app.example.com や api.example.com など、サブドメインが複数ある構成で便利です。
Let’s Encryptはワイルドカード証明書も無料発行できますが、発行にはDNS認証(DNS-01)が必須です(後述)。
Let’s Encryptとは。なぜ無料なのか
Let’s Encrypt は、非営利団体 ISRG(Internet Security Research Group)が運営する無料の認証局です。
「なぜ無料で使えるの?」 ISRGはMozillaやGoogle、シスコなどの支援を受けて運営されており、「インターネットをHTTPSで当たり前にする」という公益目的のもとで無料提供されています。有料の証明書は、認証に手間のかかるOV/EVや、サポートが必要な企業向けサービスです。個人・小規模サイトが使うDV証明書は、自動化によってコストが限りなくゼロに近いため、無料で配れます。
特徴をまとめると次のとおりです。
- 無料 — DV証明書を費用ゼロで発行できる
- 自動化前提 — ACME(エーシーエムイー)というプロトコルで、取得・更新をプログラムから自動実行できる
- 有効期限90日 — 短い設計ですが、自動更新が前提なので「更新を忘れて期限切れ」という典型事故を防げる
証明書の取得には、ACMEクライアントというツールを使います。事実上の標準が、次に説明する certbot です。
certbotで証明書を取得する
certbot(サートボット) は EFF(電子フロンティア財団)が開発するACMEクライアントです。Nginx(エンジンエックス)やApache(アパッチ)のプラグインを備え、証明書の取得から設定ファイルの書き換えまで自動化できます。
「Nginx / Apacheって何?」 どちらもWebサーバーソフトのことです。ブラウザからのリクエストを受けてHTMLや画像を返す役割を担います。VPSでWebサイトを動かす場合、たいていNginxかApacheのどちらかがインストールされています。
前提条件
- 対象ドメインのDNS(AレコードまたはAAAAレコード)が、このサーバーのIPを指している
- サーバーの 80番ポート が外部から到達できる(後述するHTTP-01認証で使う)
- Nginx または Apache が稼働している
certbotのインストール
公式は snap 経由のインストールを推奨しています(Ubuntu/Debian系の例)。
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
aptのパッケージも利用できますが、バージョンが古い場合があります。最新機能を使うならsnap版が無難です。
Nginxの場合
certbotがNginxの設定を自動で書き換え、HTTPSを有効化します。
sudo certbot --nginx -d example.com -d www.example.com
実行するとメールアドレスの入力と利用規約への同意を求められます。認証が通れば証明書が発行され、HTTP→HTTPSへのリダイレクト設定も対話形式で選べます。
Apacheの場合
sudo certbot --apache -d example.com -d www.example.com
証明書だけ取得して設定は手動でやりたい場合
Webサーバーの設定を自分で管理したいときは certonly を使います。--webroot ならサービスを止めずに認証できます。
sudo certbot certonly --webroot -w /var/www/example -d example.com
取得した証明書と秘密鍵は /etc/letsencrypt/live/example.com/ 配下に置かれます(fullchain.pem と privkey.pem)。これらをNginx/Apacheの設定で参照します。
自動更新を設定する
証明書の有効期限は90日なので、自動更新は必須です。ただし、最近のcertbotはインストール時に自動更新の仕組みを登録済みであることがほとんどです。
更新コマンドの動作確認
まず、実際には更新せずに動作だけ確認する --dry-run で試します。
sudo certbot renew --dry-run
certbot renew は、有効期限が30日未満に迫った証明書だけを更新します。期限に余裕があれば何もしません。
systemd timer(snap版・最近のディストリ)
snap版や最近のディストリビューションでは、systemdのタイマーが自動登録されています。状態は次で確認できます。
systemctl list-timers | grep certbot
sudo systemctl status snap.certbot.renew.timer
タイマーが有効なら、追加設定なしで定期的に certbot renew が走ります。
cronで管理する場合
systemd timerが使えない環境では、cronで定期実行します。/etc/cron.d/certbot などに記述します。
0 3 * * * root certbot renew --quiet --deploy-hook "systemctl reload nginx"
--deploy-hook は、証明書が実際に更新されたときだけ実行されるフックです。更新後にNginxをリロードして新しい証明書を読み込ませます(更新されなかった日は実行されません)。
よくあるエラーと対処
certbotでつまずく原因は、ほとんどがネットワークとDNSに集約されます。
| 症状 | 主な原因 | 対処 |
|---|---|---|
Timeout during connect | 80番ポートが閉じている | ファイアウォール(ufw / セキュリティグループ)で80を開ける |
DNS problem: NXDOMAIN | ドメインのAレコード未設定・伝播待ち | DNS設定を確認し、伝播を待つ |
| 認証はされるが反映されない | Aレコードが別IPを指している | dig example.com で実際の向き先を確認 |
| ワイルドカードで失敗 | HTTP-01で取ろうとしている | DNS-01認証に切り替える(後述) |
Too many certificates already issued | レート制限に到達 | 同一ドメインの再発行を控える・--dry-run で検証する |
ポート開放の確認(HTTP-01認証)
Let’s Encryptの標準認証方式「HTTP-01」は、Let’s Encryptのサーバーがこちらの80番ポートにアクセスして、ドメインの所有権を確認する仕組みです。
「HTTP-01認証って何?」 Let’s Encryptがランダムなファイルを指定し、「このURLでそのファイルが返ってきたら、あなたがこのドメインの持ち主だと認める」という手順です。これを成立させるには、Let’s Encryptのサーバーから80番ポートに到達できることが必要です(HTTPSの443番ではなく、80番であることに注意)。
ufwを使っている場合の例です。
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
クラウドVPSでは、OS側のファイアウォールに加えて、コントロールパネル側のパケットフィルタ/セキュリティグループでも80/443を許可する必要があります。両方確認してください。VPSの初期設定全般はVPS初期セキュリティ設定チェックリストも参照してください。
ワイルドカードはDNS認証(DNS-01)
*.example.com のワイルドカード証明書は、HTTP-01では取得できません。DNSのTXTレコードに指定の値を登録して所有権を証明するDNS-01認証が必須です。
「DNS-01認証って何?」 HTTP-01がWebサーバーを使うのに対して、DNS-01はDNSのTXTレコードを使います。「このTXTレコードを登録できた=このドメインのDNSを管理している=ドメインの持ち主」という確認方法です。
sudo certbot certonly --manual --preferred-challenges dns -d "*.example.com" -d example.com
--manual だと更新のたびに手作業でTXTレコードを設定することになり、自動更新と相性が悪くなります。実運用では、利用しているDNSサービスに対応したDNSプラグイン(例: Cloudflare DNS用プラグイン)を使い、TXTレコードの登録・削除をAPIで自動化するのが定石です。
Cloudflareを使っている場合の注意点
Cloudflareを使っているサイトは、通信経路が「ブラウザ ⇄ Cloudflare ⇄ オリジンサーバー」の2区間に分かれます。
Cloudflareのダッシュボードにある「SSL/TLS暗号化モード」は、このうちCloudflare ⇄ オリジン(自分のサーバー)間をどう扱うかの設定です。ここを理解しないと、鍵マークは付いているのに後半が平文という危険な状態になります。
| モード | ブラウザ ⇄ Cloudflare | Cloudflare ⇄ オリジン | 評価 |
|---|---|---|---|
| Off | 暗号化なし | 暗号化なし | 使わない |
| Flexible | 暗号化あり | 平文(HTTP) | 後半が平文。非推奨 |
| Full | 暗号化あり | 暗号化あり(証明書は検証しない) | 中間者攻撃の余地が残る |
| Full (Strict) | 暗号化あり | 暗号化あり(証明書を検証) | 推奨 |
Flexible(フレキシブル)は避けてください。 ブラウザ側だけ暗号化されるため一見問題なく見えますが、Cloudflareとオリジン間が平文のままで、リダイレクトループや混在コンテンツの原因にもなります。
推奨構成:Full (Strict)
オリジンサーバー側にLet’s Encryptの有効な証明書を入れたうえで、Cloudflareを Full (Strict) にするのが安全な構成です。全区間が暗号化され、かつオリジンの証明書も検証されます。
オリジン証明書という選択肢
Full (Strict) を使う場合、オリジン側の証明書はLet’s Encryptでも構いませんが、Cloudflare Origin CA証明書という選択肢もあります。これはCloudflare ⇄ オリジン間専用の証明書で、有効期限を最長15年に設定でき、更新の手間を大幅に減らせます。ただし、Cloudflareを経由しない直接アクセスでは信頼されない点に注意してください。
Cloudflare防御の周辺設定はCloudflare WAFで悪質Botをブロックする設定もあわせて確認してください。
まとめ
| 項目 | 要点 |
|---|---|
| HTTPSの役割 | 暗号化+認証。常時HTTPSが事実上の必須 |
| 証明書の種類 | Let’s EncryptはDV。多くのサイトはDVで十分 |
| Let’s Encrypt | 無料・非営利運営・ACMEで自動化・有効期限90日 |
| 取得 | certbot --nginx / certbot --apache で自動化 |
| 自動更新 | certbot renew(30日未満で更新)。systemd timer / cron+deploy-hook |
| ポート | HTTP-01は80番が必須。ワイルドカードはDNS-01 |
| Cloudflare | Full (Strict) を推奨。Flexibleは平文経路が残るため非推奨 |
証明書の発行と更新は無料かつ自動化できる時代です。残る課題は、それを動かすサーバー側の安定運用です。常時稼働の用途であれば、自宅PCより安価なVPSを1台用意するほうが、ポート開放やDNSの取り回しが楽になります。VPSの選び方は法人向けVPS/レンタルサーバー徹底比較も参考にしてください。
各サービス公式
国内VPSでcertbotを動かす場合、定番は次の2社です。どちらもグローバルIPが付与され、80/443の開放も管理画面から扱えます。
- ConoHa VPS — 時間課金にも対応し、検証用に立てて消す使い方がしやすい。テンプレートからのサーバー構築が速い
- Xserver VPS — 共有レンタルサーバーで実績のある運営。安定志向で常時稼働の本番用途に向く