SSL/TLS の概要
『SSL/TLS』は、インターネット上の通信を暗号化するプロトコルです。SSL(Secure Sockets Layer)は旧称で、現在は後継の TLS(Transport Layer Security)が実際に使われています。公開鍵暗号と共通鍵暗号を組み合わせたハイブリッド暗号方式により、通信内容の盗聴・改ざん・なりすましを防ぎます。Web サーバーの身元は認証局(CA: Certificate Authority)が発行するデジタル証明書によって保証されており、ブラウザは証明書チェーンを辿ることで接続先の正当性を検証します。Linux では openssl コマンドで証明書の確認・CSR 生成・自己署名証明書の作成などの操作を行います。
構文
# -----------------------------------------------
# openssl コマンドの主要サブコマンド
# -----------------------------------------------
# openssl s_client -connect {ホスト名}:{ポート番号}
# → TLS 接続を確立してサーバーの証明書情報を取得します
# → -showcerts オプションで証明書チェーン全体を表示できます
# 例: openssl s_client -connect wp-p.info:443
# openssl x509 -in {証明書ファイル} -text -noout
# → PEM 形式の証明書ファイルの詳細情報(発行者・有効期限・SANなど)を表示します
# 例: openssl x509 -in /etc/ssl/certs/wp-p.crt -text -noout
# openssl genrsa -out {秘密鍵ファイル} {鍵長}
# → RSA 秘密鍵を生成します
# → 鍵長は最低 2048 ビット、推奨は 4096 ビットです
# 例: openssl genrsa -out goku.key 4096
# openssl req -new -key {秘密鍵ファイル} -out {CSRファイル}
# → CSR(Certificate Signing Request: 証明書署名要求)を生成します
# → CA に提出することで正式な証明書を発行してもらいます
# 例: openssl req -new -key goku.key -out goku.csr
# openssl req -x509 -new -nodes -key {秘密鍵ファイル} -sha256 -days {有効日数} -out {証明書ファイル}
# → 自己署名証明書(オレオレ証明書)を生成します
# → CA による認証なしで証明書を作成します(開発・テスト環境向け)
# 例: openssl req -x509 -new -nodes -key goku.key -sha256 -days 365 -out goku.crt
# openssl verify -CAfile {CAバンドルファイル} {証明書ファイル}
# → 証明書が指定した CA によって正しく署名されているかを検証します
# 例: openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt goku.crt
# openssl pkcs12 -export -out {P12ファイル} -inkey {秘密鍵} -in {証明書} -certfile {中間CA証明書}
# → PEM 形式の証明書と秘密鍵を PKCS#12 形式(.p12 / .pfx)にまとめます
# → Windows サーバーへのインポートや一部ロードバランサーへの設定に使用します
構文一覧
| 証明書の種別 | 認証レベル | 説明 |
|---|---|---|
| DV 証明書 (Domain Validation) | ドメイン所有確認のみ | ドメインの管理権限を持つことだけを確認して発行されます。審査が最も簡易で発行が速く、Let's Encrypt などで無料取得できます。個人ブログ・開発環境などに適しています。 |
| OV 証明書 (Organization Validation) | 組織実在確認あり | ドメイン所有確認に加えて、申請者の組織(法人)が実在するかを CA が審査して発行されます。証明書に組織名が含まれるため、利用者が発行元を確認できます。企業サイト・ECサイトなどに適しています。 |
| EV 証明書 (Extended Validation) | 最高レベルの組織実在確認 | OV よりも厳格な審査(登記情報・電話確認など)を経て発行されます。かつてはブラウザのアドレスバーが緑色になりましたが、現在は主要ブラウザでの視覚的表示は廃止されています。金融機関・大手 EC サイトなどに使用されます。 |
| ワイルドカード証明書 | DV または OV | ドメイン名に *.example.com のようなワイルドカードを使用し、複数のサブドメインを1枚の証明書でカバーできます。サブドメインが多数あるサービスで証明書管理を簡略化できます。 |
| マルチドメイン証明書 (SAN証明書) | DV / OV / EV | SAN(Subject Alternative Name)フィールドを使って複数の異なるドメインを1枚の証明書でカバーできます。関連する複数サービスをまとめて管理したい場合に使用します。 |
| 自己署名証明書 | 認証なし(開発用途) | CA に依頼せず自分で署名した証明書です。無料で即時作成できますが、ブラウザには「信頼されない証明書」と警告が表示されます。開発環境・社内システムなど外部公開しない用途に限定して使用します。 |
使用例
証明書の情報を確認する
# ----------------------------------------------- # サーバーの証明書情報を取得して確認します # ----------------------------------------------- # wp-p.info の TLS 証明書情報を取得します # -showcerts オプションで証明書チェーン(中間CA証明書を含む)も表示できます openssl s_client -connect wp-p.info:443 -showcerts </dev/null 2>/dev/null | \ openssl x509 -noout -text | grep -E "Subject:|Issuer:|Not Before:|Not After :"
実行するコマンドは次の通りです。
$ openssl s_client -connect wp-p.info:443 -showcerts </dev/null 2>/dev/null | \
> openssl x509 -noout -text | grep -E "Subject:|Issuer:|Not Before:|Not After :"
Issuer: C=US, O=Let's Encrypt, CN=R11
Validity
Not Before: Jan 10 00:00:00 2025 GMT
Not After : Apr 10 23:59:59 2025 GMT
Subject: CN=wp-p.info
実装例は次の通りです。
# ----------------------------------------------- # ローカルの証明書ファイルを確認します # ----------------------------------------------- # PEM 形式の証明書ファイルの詳細情報を表示します openssl x509 -in /etc/ssl/certs/goku.crt -text -noout # 有効期限だけを確認したい場合は -dates オプションが便利です openssl x509 -in /etc/ssl/certs/goku.crt -noout -dates # 証明書の Subject Alternative Name(SAN)を確認します # 複数ドメインをカバーしているか確認するときに使います openssl x509 -in /etc/ssl/certs/goku.crt -noout -ext subjectAltName
実行するコマンドは次の通りです。
$ openssl x509 -in /etc/ssl/certs/goku.crt -noout -dates
notBefore=Jan 10 00:00:00 2025 GMT
notAfter=Apr 10 23:59:59 2025 GMT
$ openssl x509 -in /etc/ssl/certs/goku.crt -noout -ext subjectAltName
X509v3 Subject Alternative Name:
DNS:goku.example.com, DNS:www.goku.example.com
自己署名証明書の作成(開発環境用)
# ----------------------------------------------- # 開発環境用の自己署名証明書を作成します # ----------------------------------------------- # 手順1: RSA 秘密鍵(4096ビット)を生成します # -out で出力先のファイル名を指定します openssl genrsa -out goku.key 4096 # 手順2: CSR(証明書署名要求)を生成します # 対話形式で CN(Common Name)にドメイン名またはサーバー名を入力します # 開発環境では CN=localhost と入力するのが一般的です openssl req -new -key goku.key -out goku.csr \ -subj "/C=JP/ST=Tokyo/O=KameHouse/CN=localhost" # 手順3: CSR に自己署名して証明書を生成します(有効期間 365 日) # -x509 → 自己署名証明書を生成します(CA への送付なし) # -nodes → 秘密鍵をパスフレーズなしで生成します(サーバー自動起動のため) # -sha256 → SHA-256 署名アルゴリズムを使用します openssl req -x509 -new -nodes -key goku.key -sha256 -days 365 -out goku.crt \ -subj "/C=JP/ST=Tokyo/O=KameHouse/CN=localhost" # 生成した証明書の内容を確認します openssl x509 -in goku.crt -noout -text | head -20
実行するコマンドは次の通りです。
$ openssl genrsa -out goku.key 4096
Generating RSA private key, 4096 bit long modulus (2 primes)
.....................++++
.............++++
e is 65537 (0x010001)
$ openssl req -x509 -new -nodes -key goku.key -sha256 -days 365 -out goku.crt \
> -subj "/C=JP/ST=Tokyo/O=KameHouse/CN=localhost"
$ openssl x509 -in goku.crt -noout -text | head -20
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
3a:1f:88:c2:de:4b:9e:07:d5:21:0f:6c:72:a4:55:b3:89:2d:1e:f4
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = JP, ST = Tokyo, O = KameHouse, CN = localhost
Validity
Not Before: Mar 25 00:00:00 2026 GMT
Not After : Mar 25 00:00:00 2027 GMT
Subject: C = JP, ST = Tokyo, O = KameHouse, CN = localhost
CSR を生成して認証局に証明書を申請する
# ----------------------------------------------- # 本番環境向けの CSR を生成して CA に提出します # (ここでは vegeta.example.com ドメインを例にします) # ----------------------------------------------- # 手順1: 本番用 RSA 秘密鍵を生成します # 本番環境では秘密鍵を厳重に管理してください(chmod 600 推奨) openssl genrsa -out vegeta.key 4096 chmod 600 vegeta.key # 手順2: SAN(Subject Alternative Name)を含む CSR を生成します # 現在の CA は CN のみでは SAN なしとして扱うため、 # -extensions と -reqexts で SAN を明示的に指定します openssl req -new -key vegeta.key -out vegeta.csr \ -subj "/C=JP/ST=Tokyo/O=SaiyaJinElite/CN=vegeta.example.com" \ -addext "subjectAltName=DNS:vegeta.example.com,DNS:www.vegeta.example.com" # 生成した CSR の内容を確認します # CSR ファイルをこのまま CA(Let's Encrypt・商用 CA など)に提出します openssl req -in vegeta.csr -noout -text | grep -A2 "Subject Alternative Name"
実行するコマンドは次の通りです。
$ openssl req -in vegeta.csr -noout -text | grep -A2 "Subject Alternative Name"
Requested Extensions:
X509v3 Subject Alternative Name:
DNS:vegeta.example.com, DNS:www.vegeta.example.com
概要
『SSL/TLS』の通信確立(TLS ハンドシェイク)は、大まかに次の流れで行われます。①クライアントが対応する TLS バージョンと暗号スイートの一覧をサーバーに送信します。②サーバーが証明書と公開鍵を返します。③クライアントが証明書チェーンを辿って認証局による署名を検証します。④公開鍵暗号で共通鍵を安全に交換します。⑤以降の通信は共通鍵暗号(AES など)で暗号化されます。この仕組みにより、第三者が通信を傍受しても内容を解読できません。証明書チェーンとは、サーバー証明書 → 中間 CA 証明書 → ルート CA 証明書という信頼の連鎖であり、ブラウザはあらかじめ組み込まれたルート CA 証明書ストアを起点として検証を行います。本番環境での証明書取得には Let's Encrypt(Certbot) による無料の DV 証明書が広く利用されています。取得した証明書を Nginx に設定する方法については Nginx への SSL/TLS 設定 を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。