Carpe Diem

備忘録

SSL/TLS周りで必要な知識

概要

SSL/TLSでは

など色々なファイルや用語があり、混乱しやすいのでまとめます。

認証局(CA)について

ルートCA

認証局です。
この認証局が発行するルート証明書は自身が署名します。
いわゆるオレオレ証明書になります。
一般的には社会的に信用された企業がルート認証局となります。
ブラウザなどTLSのクライアントサイドは一般的なルート証明書をデフォルトで持っています

中間CA

ルート認証局に認められた認証局です。
中間CAがあることで運用上の手続きがスムーズになったり、問題が起きた時のrevokeがしやすいといったセキュリティ的なメリットなどがあります。
詳しくは以下のサイトで説明されてます。

中間証明書の必要性、証明機関(認証局)の階層化の理由 | SEの道標

証明書について

ルート証明書・中間証明書・サーバ証明書の関係

こちらのサイトの図が非常に分かりやすいです。

f:id:quoll00:20180717010336p:plain

ref: プライベートルート証明書・中間証明書・サーバ証明書の作り方 - Apache 2.4系でHTTP/2対応サーバを構築してみるテスト。

ルート証明書・中間証明書・サーバ証明書の区別の方法は?

$ openssl x509 -in xxx.crt -text -noout

してみると以下の特徴があります。

証明書 特徴
ルート証明書 自己証明書なのでIssuerSubjectCNが同じ
中間証明書 Issuer CNがルート認証局
Subject CNが中間認証局
CRLがルート認証局のもの
サーバ証明書 Issuer CNが中間認証局
Subject CNドメイン
CRLが中間認証局のもの

各証明書等のインストール先

各証明書のインストール先は以下です。

証明書 インストール先
ルート証明書 クライアント
中間証明書 サーバ
サーバ証明書 サーバ
サーバ証明書秘密鍵 サーバ

証明書から公開鍵を取り出す方法は?

$ openssl x509 -in xxx.crt -pubkey -noout

で以下のように出力されます。-nooutを付けないと読み込んだ証明書も出力されます。

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6JcBiE1tzJ73/6bjJAbR
ariOuOAcF86nywXhnR1CnWRXwHrJw7jbJzC3oLkOwVKMkEHYH+Y38xlKNF09DMMD
uW4d+5tAQmcVRw6EzxjiplZRMMEB9CRf7+gFv57SpqlFi4FwprhywHxEQNwPsPfj
Fk2Artb99sr3GWKa+37YOAAUFStY+NWqsWLU33m7DVHoKWdIwRtwvwCdHpo2NuaP
nvW8OpFN3JmEp5xJZ4oIGztnq+vxPlZhtxXHkT5R8SZPI2+lqTJIU9bsw9GLcvid
BMffHBPq1De1CjvvUpEzKLBiDrcGucENe0ZOGPOTxJK++KbZ4UE1BJ518X6qFLz3
8QIDAQAB
-----END PUBLIC KEY-----

証明書の検証フロー

  1. サーバ証明書は中間CAから発行されている
  2. 中間CAの中間証明書はルートCAから発行されている
  3. クライアントがルートCAのルート証明書を持っていれば遡ってサーバ証明書の正当性が保証できる
    1. ルート証明書=ルートCAの公開鍵
    2. ルートCAの公開鍵で中間証明書にあるルートCAの署名を検証
    3. 中間証明書が正当と分かったので、中間CAの公開鍵を使える
    4. 中間CAの公開鍵でサーバ証明書にある中間CAの署名を検証
    5. サーバ証明書が正当と分かる

と言う感じですね。

TLS接続の確立フロー

f:id:quoll00:20180728105037p:plain

ref: https://cspssl.jp/guide/mechanism.php

  1. クライアントがサーバに接続要求
  2. サーバはクライアントに中間証明書・サーバ証明書を渡す
  3. 前述の検証フローで正しいサーバ証明書と分かる
  4. クライアント側で暗号通信用の共通鍵を用意
  5. サーバ証明書にある公開鍵を使って、共通鍵を暗号化してサーバに渡す
  6. 暗号化された共通鍵を、サーバ証明書を作った時の秘密鍵で復号
  7. 共通鍵をクライアント・サーバで保持できたので暗号化通信が可能

と言う感じです。

まとめ

TLSで必要な用語やフローを説明しました。

ソース