LESSON 30分

ストーリー

あなた
社内ツールにアクセスしたら『この接続ではプライバシーが保護されません』ってエラーが出る
佐藤先輩
ああ、SSL証明書の問題だな。証明書が期限切れか、設定が間違っているかだ
あなた
SSL証明書って、あの鍵マークのやつですか?
佐藤先輩
そう。HTTPSの裏側でどんな仕組みが動いているか、ちゃんと理解しておこう

SSL/TLS とは

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

HTTPとHTTPSの違い

graph LR
    subgraph "HTTP(平文、盗聴可能)"
        A1["クライアント"] <-->|平文| B1["サーバー"]
    end
    subgraph "HTTPS(暗号化、安全)"
        A2["クライアント"] <-->|暗号化| B2["サーバー"]
    end

    classDef danger fill:#f8d7da,stroke:#dc3545,color:#000
    classDef safe fill:#d4edda,stroke:#28a745,color:#000
    class A1,B1 danger
    class A2,B2 safe

現在は SSL は古く非推奨で、TLS が使われています。ただし慣例的に「SSL証明書」と呼ばれることが多いです。


SSL/TLSのハンドシェイク

HTTPSの接続確立時に行われるやりとりです(TCPの3ウェイハンドシェイクの後)。

sequenceDiagram
    participant C as クライアント
    participant S as サーバー
    C->>S: ClientHello(使用可能な暗号方式を提示)
    S->>C: ServerHello + 証明書(暗号方式の決定 + 証明書送信)
    Note over C: 証明書を検証(有効性を確認)
    C->>S: 鍵交換(暗号化通信のための鍵を交換)
    S->>C: 完了
    Note over C,S: 暗号化通信開始

SSL証明書の構成要素

要素説明
ドメイン名証明書が有効なドメイン(例: example.com)
発行者(CA)証明書を発行した認証局(例: Let’s Encrypt)
有効期限証明書の有効開始日と終了日
公開鍵暗号化に使う公開鍵
署名認証局による電子署名

証明書チェーン

証明書は**チェーン(連鎖)**で信頼性を確保します。

graph TD
    ROOT["ルート証明書(Root CA)<br/>OSやブラウザに組み込まれている"]
    INT["中間証明書(Intermediate CA)<br/>ルートCAが署名"]
    SRV["サーバー証明書<br/>中間CAが署名。あなたのサイト用"]

    ROOT -->|署名| INT
    INT -->|署名| SRV

    classDef root fill:#cce5ff,stroke:#004085,color:#000
    classDef inter fill:#fff3cd,stroke:#856404,color:#000
    classDef server fill:#d4edda,stroke:#155724,color:#000
    class ROOT root
    class INT inter
    class SRV server

ブラウザは、サーバー証明書から中間証明書、ルート証明書までチェーンをたどり、信頼できるルートCAにたどり着けば「安全」と判断します。


openssl コマンドで証明書を確認

基本的な証明書確認

# サーバーの証明書を表示
openssl s_client -connect example.com:443 -servername example.com

# 出力の見方:
# Certificate chain   ← 証明書チェーン
#  0 s:CN = example.com   ← サーバー証明書
#    i:C = US, O = Let's Encrypt, CN = R3   ← 発行者
#  1 s:C = US, O = Let's Encrypt, CN = R3   ← 中間証明書
#    i:O = Digital Signature Trust Co., CN = DST Root CA X3   ← ルートCA

証明書の有効期限を確認

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
notBefore=Jan  1 00:00:00 2024 GMT   ← 有効開始日
notAfter=Apr  1 00:00:00 2024 GMT    ← 有効終了日

証明書の詳細を確認

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text

curl でHTTPSの問題を診断

# 詳細な接続情報(SSL含む)
curl -v https://example.com

# 出力例(正常):
# * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
# * Server certificate:
# *  subject: CN=example.com
# *  SSL certificate verify ok.

# 証明書の検証をスキップ(テスト用、本番では非推奨)
curl -k https://example.com

Let’s Encrypt

無料でSSL証明書を発行する認証局です。

特徴

項目内容
費用無料
有効期間90日
更新certbot で自動更新
ドメイン検証HTTP-01 または DNS-01

certbot の基本

# 証明書の取得
sudo certbot certonly --webroot -w /var/www/html -d example.com

# 証明書の更新
sudo certbot renew

# 自動更新の設定(cronまたはsystemdタイマー)
# 通常インストール時に自動設定される

よくあるSSL/TLS障害

1. 証明書の期限切れ

症状: 「NET::ERR_CERT_DATE_INVALID」
確認: openssl s_client で有効期限を確認
対応: 証明書を更新(certbot renew)

2. ドメイン名の不一致

症状: 「NET::ERR_CERT_COMMON_NAME_INVALID」
確認: 証明書のCN/SANとアクセスURLのドメインが一致しているか
対応: 正しいドメイン名で証明書を再取得

3. 中間証明書の欠落

症状: 一部のブラウザやOSでだけエラー
確認: openssl s_client で証明書チェーンを確認
対応: 中間証明書をサーバーに設定

4. 自己署名証明書

症状: 「NET::ERR_CERT_AUTHORITY_INVALID」
確認: 発行者が信頼されたCAではない
対応: 正規のCAから証明書を取得(Let's Encrypt等)

まとめ

ポイント内容
SSL/TLS通信を暗号化するプロトコル
証明書ドメインの所有者を証明し、暗号化の鍵を提供
証明書チェーンルートCA → 中間CA → サーバー証明書の信頼の連鎖
openssl証明書の内容や有効期限を確認するコマンド
Let’s Encrypt無料の証明書発行サービス(90日ごとに更新)

チェックリスト

  • SSL/TLSハンドシェイクの流れを理解した
  • openssl で証明書の有効期限を確認できる
  • 証明書チェーンの概念を説明できる
  • よくあるSSL障害パターンを把握した

次のステップへ

SSL/TLS証明書の仕組みと障害対応を学びました。 次のセクションでは、プロキシとロードバランサーについて学びます。


推定読了時間: 30分