Webセキュリティ

SSL/TLS証明書の仕組みとLet's Encrypt導入ガイド

セキュリティ

SSL/TLS証明書の仕組みと
Let's Encrypt導入ガイド

HTTPS化に必要なSSL/TLS証明書の仕組みと、無料のLet's Encryptの導入方法を解説します。

こんな人向けの記事です

  • WebサイトをHTTPS化したい人
  • SSL/TLSの仕組みを理解したい人
  • Let's Encryptで無料の証明書を取得したい人

Step 1SSL/TLSとは

SSL(Secure Sockets Layer)/ TLS(Transport Layer Security)は、通信を暗号化するプロトコルです。

SSL/TLSの役割
# SSL/TLSが提供する3つの機能

# 1. 暗号化(Encryption)
#    通信内容を第三者が読めないように暗号化
#    → パスワードやクレジットカード情報を保護

# 2. 認証(Authentication)
#    接続先が本物のサーバーであることを証明
#    → フィッシングサイトとの区別

# 3. 完全性(Integrity)
#    通信内容が途中で改ざんされていないことを保証

# バージョンの歴史
# SSL 2.0 (1995) → 脆弱性あり、使用禁止
# SSL 3.0 (1996) → 脆弱性あり、使用禁止
# TLS 1.0 (1999) → 非推奨
# TLS 1.1 (2006) → 非推奨
# TLS 1.2 (2008) → 現在の主流
# TLS 1.3 (2018) → 最新、推奨
SSLとTLSの違い
SSLはTLSの前身です。現在使われているのは全てTLSですが、慣習的に「SSL証明書」と呼ばれています。

Step 2証明書の種類

証明書の種類
# 認証レベルによる分類

# DV(Domain Validation)ドメイン認証
# - ドメインの所有権のみ確認
# - 最も簡単・安価(Let's Encryptは無料)
# - 個人サイト、ブログに最適

# OV(Organization Validation)組織認証
# - 組織の実在性を確認
# - 企業サイト向け

# EV(Extended Validation)拡張認証
# - 最も厳格な審査
# - 金融機関、大企業向け

# 対象範囲による分類

# シングルドメイン: example.com のみ
# ワイルドカード: *.example.com(サブドメイン全て)
# マルチドメイン(SAN): 複数ドメインに対応

Step 3TLSハンドシェイク

TLS 1.3 ハンドシェイク
# TLS 1.3 ハンドシェイク(1-RTT)

# 1. Client Hello
#    クライアント → サーバー
#    - 対応するTLSバージョン
#    - 対応する暗号スイート
#    - 鍵共有パラメータ(Key Share)

# 2. Server Hello + 証明書
#    サーバー → クライアント
#    - 選択した暗号スイート
#    - サーバー証明書
#    - 鍵共有パラメータ
#    - 暗号化開始

# 3. 証明書の検証
#    クライアント側で:
#    - 証明書チェーンの検証(ルートCAまで)
#    - 有効期限の確認
#    - ドメイン名の一致確認

# 4. 暗号化通信開始
#    共有鍵で暗号化されたHTTP通信

# TLS 1.3は1.2より1往復少ない(高速)

# 確認コマンド
# openssl s_client -connect example.com:443
# curl -v https://example.com 2>&1 | grep TLS

Step 4Let's Encryptの導入

ターミナル
# Certbot のインストール
# Ubuntu
sudo apt update
sudo apt install certbot python3-certbot-nginx

# macOS
brew install certbot

# 証明書の取得(nginx使用時)
sudo certbot --nginx -d example.com -d www.example.com

# 証明書の取得(スタンドアロン)
sudo certbot certonly --standalone -d example.com

# 証明書の保存場所
# /etc/letsencrypt/live/example.com/
#   fullchain.pem  - サーバー証明書 + 中間証明書
#   privkey.pem    - 秘密鍵
#   cert.pem       - サーバー証明書のみ
#   chain.pem      - 中間証明書のみ

# 証明書の確認
sudo certbot certificates

# 手動で更新テスト
sudo certbot renew --dry-run
自動更新の設定
# cronで自動更新(90日ごとに期限切れ)
# certbotは自動でcronを設定するが、手動設定する場合:
echo "0 3 * * * certbot renew --quiet --post-hook 'systemctl reload nginx'" | sudo crontab -
Let's Encryptの制限
有効期間は90日です。自動更新を必ず設定してください。またレート制限(週50証明書/ドメイン)があります。

Step 5nginxでのHTTPS設定

/etc/nginx/conf.d/ssl.conf
server {
    listen 443 ssl http2;
    server_name 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;
    ssl_prefer_server_ciphers off;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # セキュリティヘッダー
    add_header Strict-Transport-Security "max-age=63072000" always;

    location / {
        proxy_pass http://localhost:8000;
    }
}

# HTTP → HTTPS リダイレクト
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

Step 6セキュリティ強化

ターミナル
# SSL/TLS設定のテスト
# SSL Labs でA+評価を目指す
# https://www.ssllabs.com/ssltest/

# testssl.sh でローカルテスト
# docker run --rm -ti drwetter/testssl.sh example.com

# 証明書の有効期限確認
echo | openssl s_client -connect example.com:443 2>/dev/null |   openssl x509 -noout -dates

# セキュリティチェックリスト
# 1. TLS 1.2以上のみ有効化
# 2. HSTS(HTTP Strict Transport Security)を設定
# 3. 安全な暗号スイートのみ使用
# 4. OCSP Staplingを有効化
# 5. 証明書の自動更新を設定
# 6. HTTPからHTTPSへのリダイレクト
# 7. mixedコンテンツ(HTTP画像等)の排除

まとめ

  • SSL/TLSは通信の暗号化・認証・完全性を提供
  • TLS 1.2以上を使用(SSL/TLS 1.0/1.1は非推奨)
  • Let's Encryptで無料DV証明書を取得
  • certbotで自動更新を設定(90日ごと)
  • HSTSとOCSP Staplingで追加のセキュリティ確保