SSL/TLS証明書の仕組み入門|HTTPSの基本からLet's Encrypt設定まで

kento_morota 17分で読めます

「HTTPSにしないとブラウザに警告が表示される」「SEOにも影響がある」——HTTPS化の重要性は多くの方が認識していますが、SSL/TLSがどのような仕組みで安全な通信を実現しているのか、正確に理解している方は意外と少ないのではないでしょうか。

本記事では、SSL/TLSの基本原理から証明書の種類、Let's Encryptを使った無料HTTPS化の手順まで、体系的に解説します。

SSL/TLSとHTTPSの基礎知識

まず、よく混同されるSSL、TLS、HTTPSの関係を整理しましょう。

SSL・TLS・HTTPSの関係

SSL(Secure Sockets Layer)
1990年代にNetscape社が開発した暗号化通信プロトコルです。SSL 3.0まで開発されましたが、深刻な脆弱性(POODLE攻撃など)が発見され、現在は使用が非推奨となっています。

TLS(Transport Layer Security)
SSLの後継プロトコルです。現在はTLS 1.3が最新バージョンで、広く使われています。「SSL」と呼ばれることが多いですが、実際に使われているのはTLSです。

HTTPS(HTTP over TLS)
HTTPにTLSによる暗号化を組み合わせたプロトコルです。URLがhttps://で始まるサイトはHTTPSを使用しています。

つまり、「SSL証明書」と一般的に呼ばれるものは、正確には「TLS証明書」であり、HTTPSはTLSの上でHTTP通信を行う仕組みです。

TLSのバージョンと推奨設定

2026年時点での各バージョンの状況は以下の通りです。

TLS 1.0/1.1:非推奨。主要ブラウザではサポートが終了しています。使用しないでください。

TLS 1.2:現在も広く使われていますが、設定によっては脆弱な暗号スイートが使用される可能性があります。

TLS 1.3:最新版。ハンドシェイクが高速化され、脆弱な暗号スイートが排除されています。可能な限りTLS 1.3を優先してください。

HTTPSが安全な通信を実現する仕組み

HTTPSは「暗号化」「認証」「完全性」の3つの要素で安全な通信を保証します。

TLSハンドシェイクの流れ

ブラウザとサーバーがHTTPS通信を開始するとき、TLSハンドシェイクと呼ばれる鍵交換プロセスが行われます。TLS 1.3では、わずか1往復(1-RTT)でハンドシェイクが完了します。

ステップ1:Client Hello
ブラウザがサーバーに接続し、対応するTLSバージョン、暗号スイート、そして鍵交換に必要なパラメータを送信します。

ステップ2:Server Hello + 証明書
サーバーが暗号スイートを選択し、SSL/TLS証明書を返します。TLS 1.3では、この段階で暗号化が開始されます。

ステップ3:証明書の検証
ブラウザが以下を確認します。
・証明書が信頼された認証局(CA)によって発行されているか
・証明書の有効期限が切れていないか
・証明書のドメイン名がアクセス先と一致するか
・証明書が失効(Revoke)されていないか

ステップ4:鍵交換と暗号化通信の開始
共通鍵が安全に共有され、以降の通信はこの共通鍵で暗号化されます。

公開鍵暗号と共通鍵暗号の使い分け

TLSでは2種類の暗号方式を組み合わせて使用します。

公開鍵暗号(非対称暗号)
鍵のペア(公開鍵と秘密鍵)を使用します。公開鍵で暗号化したデータは秘密鍵でのみ復号できます。TLSハンドシェイクでの鍵交換と証明書の署名検証に使われます。処理が重いため、大量のデータ暗号化には向きません。

共通鍵暗号(対称暗号)
同じ鍵で暗号化と復号を行います。処理が高速で、実際のデータ通信の暗号化に使われます。ハンドシェイクで安全に共有された共通鍵を使って通信します。

このように、公開鍵暗号で安全に鍵を交換し、共通鍵暗号で高速にデータを暗号化するという組み合わせにより、セキュリティと性能の両立を実現しています。

SSL/TLS証明書の種類と選び方

SSL/TLS証明書は、検証レベルと対応ドメイン数によって分類されます。

検証レベルによる分類

DV(Domain Validation)証明書
ドメインの所有権のみを確認して発行されます。最も手軽で安価(無料もあり)な証明書です。Let's Encryptが発行するのはDV証明書です。個人サイトやブログ、小規模なWebアプリケーションに適しています。

OV(Organization Validation)証明書
ドメイン所有権に加えて、組織の実在性も確認されます。企業のコーポレートサイトやBtoBサービスに適しています。年間数万円程度の費用がかかります。

EV(Extended Validation)証明書
最も厳格な審査を経て発行されます。組織の法的存在、物理的存在、運営実態が確認されます。金融機関やECサイトなど、高い信頼性が求められるサイトで使用されます。年間十万円以上の費用が一般的です。

暗号化の強度はDV、OV、EVで違いはありません。違いは「サイト運営者の身元確認のレベル」です。

対応ドメインによる分類

シングルドメイン証明書
1つのドメイン(例:example.com)のみに対応します。

ワイルドカード証明書
特定ドメインのすべてのサブドメインに対応します(例:*.example.com)。www.example.com、api.example.com、admin.example.comなどをカバーできます。

マルチドメイン(SAN)証明書
複数の異なるドメインを1つの証明書でカバーします(例:example.com、example.net、example.org)。

Let's Encryptで無料HTTPS化する手順

Let's Encryptは、非営利団体Internet Security Research Group(ISRG)が運営する無料の認証局です。Certbotツールを使って簡単にSSL/TLS証明書を取得・更新できます。

Certbotのインストールと証明書取得

# Ubuntu/Debianの場合
sudo apt update
sudo apt install certbot python3-certbot-nginx

# Nginxを使用している場合の証明書取得
sudo certbot --nginx -d example.com -d www.example.com

# Apacheを使用している場合
sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com

# Webサーバーを使わずにスタンドアロンで取得
sudo certbot certonly --standalone -d example.com

Certbotは対話形式で設定を進めます。メールアドレスの入力と利用規約への同意が求められます。

証明書の自動更新

Let's Encrypt証明書の有効期限は90日間です。Certbotをインストールすると、自動更新用のタイマーまたはcronジョブが設定されます。

# 自動更新の設定確認
sudo systemctl status certbot.timer

# 手動で更新テストを実行
sudo certbot renew --dry-run

# 更新成功時にNginxをリロードする設定
# /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
#!/bin/bash
systemctl reload nginx

ワイルドカード証明書の取得

ワイルドカード証明書はDNS認証が必要です。

# DNS認証によるワイルドカード証明書の取得
sudo certbot certonly --manual --preferred-challenges dns \
  -d "*.example.com" -d "example.com"

# Certbotが表示するTXTレコードをDNSに追加する
# _acme-challenge.example.com に指定された値を設定

# Cloudflare DNSプラグインを使った自動化
sudo apt install python3-certbot-dns-cloudflare

# Cloudflare APIキーの設定ファイルを作成
# /etc/letsencrypt/cloudflare.ini
# dns_cloudflare_api_token = your-api-token

sudo certbot certonly --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  -d "*.example.com" -d "example.com"

NginxでのHTTPS設定

取得した証明書をNginxに設定する方法を解説します。セキュリティと性能を考慮した推奨設定を紹介します。

基本的なHTTPS設定

# /etc/nginx/sites-available/example.com

# HTTPからHTTPSへのリダイレクト
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    # ACMEチャレンジ用のパス(Let's Encrypt更新時に必要)
    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    # その他のリクエストはHTTPSにリダイレクト
    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPS設定
server {
    listen 443 ssl http2;
    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;

    # TLSバージョンの制限
    ssl_protocols TLSv1.2 TLSv1.3;

    # 暗号スイートの設定
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;

    # OCSPステープリング
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    resolver 8.8.8.8 8.8.4.4 valid=300s;

    # セッションキャッシュ
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;

    # セキュリティヘッダー
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "DENY" always;
    add_header X-XSS-Protection "0" always;

    root /var/www/example.com;
    index index.html;
}

各設定項目の解説

ssl_protocols
TLS 1.2とTLS 1.3のみを許可します。TLS 1.0/1.1は脆弱性があるため無効化してください。

ssl_prefer_server_ciphers
TLS 1.3では不要な設定ですが、TLS 1.2との互換性のために残しています。TLS 1.3のみの環境であればoffのままで問題ありません。

OCSPステープリング
証明書の失効状態をサーバーが代わりに確認し、クライアントに提供する仕組みです。クライアントが別途OCSPサーバーに問い合わせる必要がなくなり、接続速度が向上します。

HSTS(HTTP Strict Transport Security)
ブラウザに対して「このサイトには必ずHTTPSでアクセスせよ」と指示するヘッダーです。max-ageで指定した期間(秒数)、ブラウザはHTTPでのアクセスを自動的にHTTPSにアップグレードします。

CaddyでのHTTPS設定

Caddyは自動HTTPS機能を備えたモダンなWebサーバーです。設定がシンプルで、SSL/TLS証明書の取得・更新を自動的に行います。

# Caddyfile - 最小限の設定でHTTPS対応
example.com {
    root * /var/www/example.com
    file_server
}

# これだけで以下が自動的に行われる
# - Let's Encryptから証明書を取得
# - HTTPからHTTPSへのリダイレクト
# - 証明書の自動更新
# - TLS 1.2/1.3の設定
# - OCSPステープリング
# より詳細なTLS設定が必要な場合
example.com {
    tls {
        protocols tls1.2 tls1.3
        ciphers TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    }

    header {
        Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
    }

    root * /var/www/example.com
    file_server
}

SSL/TLS設定のテストと運用

設定が完了したら、正しく機能しているかテストしましょう。

SSL Labsでのテスト

Qualys SSL Labs(https://www.ssllabs.com/ssltest/)は、SSL/TLS設定の品質を評価する無料のオンラインツールです。A+評価を目指しましょう。

主なチェック項目は以下の通りです。

・証明書チェーン(中間証明書が正しく設定されているか)
・プロトコルバージョン(TLS 1.0/1.1が無効化されているか)
・暗号スイート(脆弱な暗号が使われていないか)
・HSTSの設定
・OCSPステープリングの動作

コマンドラインでの確認

# 証明書の情報を確認
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null | openssl x509 -noout -dates -subject -issuer

# TLSバージョンの確認
openssl s_client -connect example.com:443 -tls1_3

# 証明書チェーンの確認
openssl s_client -connect example.com:443 -servername example.com -showcerts

# 証明書の有効期限をチェックするスクリプト
#!/bin/bash
DOMAIN="example.com"
EXPIRY=$(echo | openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "${EXPIRY}" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))

echo "${DOMAIN}: 残り ${DAYS_LEFT} 日"
if [ ${DAYS_LEFT} -lt 30 ]; then
  echo "警告: 証明書の有効期限が30日以内です!"
fi

証明書の監視

証明書の有効期限切れは、ユーザーに警告画面を表示し、サービスの信頼性を大きく損ないます。以下の対策を行いましょう。

・Certbotの自動更新が正常に動作しているか定期的に確認する
・有効期限の監視アラートを設定する(30日前、14日前、7日前)
・証明書の更新後にWebサーバーのリロードが自動実行されることを確認する
・複数環境(ステージング、本番)がある場合は、すべての環境の証明書を管理する

まとめ:HTTPS化を確実に実施しよう

SSL/TLS証明書によるHTTPS化は、Webサイトのセキュリティにおける最も基本的な対策です。

本記事のポイントをまとめます。

基礎知識
・SSL/TLSは通信の暗号化・認証・完全性を保証するプロトコル
・現在使われているのはTLS 1.2/1.3であり、TLS 1.3の使用を推奨
・TLSハンドシェイクで公開鍵暗号と共通鍵暗号を組み合わせて使用する

証明書の選択
・小規模サイトにはLet's Encrypt(DV証明書)で十分
・企業サイトではOV証明書、金融・ECサイトではEV証明書を検討する
・複数サブドメインがある場合はワイルドカード証明書が便利

実装のポイント
・TLS 1.0/1.1を無効化し、安全な暗号スイートのみを許可する
・HSTSヘッダーを設定してHTTPSを強制する
・OCSPステープリングで接続速度を向上させる
・SSL Labsでテストし、A+評価を目指す

運用
・Let's Encryptの証明書は90日間有効。Certbotの自動更新を必ず設定する
・証明書の有効期限を監視するアラートを導入する
・Caddyを使えば、HTTPS設定をほぼ自動化できる

HTTPS化はもはやオプションではなく必須要件です。本記事を参考に、確実にHTTPS化を実施してください。

#SSL#TLS#HTTPS
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

起業準備に役立つ情報、もっとありますよ。

まずは話だけ聞いてもらう