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 TLSStep 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で追加のセキュリティ確保