Open4

SSLに関するメモ

dexcterdexcter

ディジタル証明書

(公開鍵)証明書とは?

公開鍵と公開鍵の作成者(所有者)を紐づけるための証明書

なぜ(公開鍵)証明書は必要?

公開鍵を渡す時に渡された公開鍵が本物か検証するため。
証明書がないとMITM攻撃により盗聴されていても、送信者・受信者ともに気づくことができない。以下、MITM攻撃の流れ。

(公開鍵)証明書の発行手順

1.(認証局または利用者が)鍵ペアの生成
2. 認証局に公開鍵を送付(認証局が鍵を生成した場合は、利用者に秘密鍵を送付)
3. 認証局が秘密鍵で公開鍵に署名し、証明書を作成
4.証明書を取得

(公開鍵)証明書の検証

1.証明書を認証局の公開鍵で検証
※認証局の公開鍵の真正は上位の認証局が発行する証明書によって成立する。最終的な公開鍵の真正はルート認証局の信頼性に依存する。ルート認証局の公開鍵はあらかじめWebブラウザやOSに入っている。

(公開鍵)証明書のフォーマット

署名前証明書、署名アルゴリズム、署名値ので成り立っている。
署名前証明書が署名アルゴリズムのアルゴリズムで署名される。その値が署名値である。

署名前証明書の中身

  • version(バージョン)
  • Serial Number(シリアル番号)
  • Certificate Signature Algorithm(証明書に署名する時のアルゴリズム)
  • Certificate Signature Value(証明書に署名した時のハッシュ値)
  • Issuer(発行者)
  • Validity(有効期間)
    • Not Before(開始日)
    • Not After(終了日)
  • Subject(主体者)
  • Subject Public Key Info(主体者の公開鍵情報)
    • Subject Public Key Algorithm(公開鍵アルゴリズム)
    • Subject's Puublic Key(公開鍵)
  • Extensions(拡大領域)
  • Fingerprints(証明書全体のハッシュ値)

Issuerの値にはDNが使用されています。
https://jp.globalsign.com/support/cert-management/distinguish-name.html

疑問

Q.証明書が正しいことの証明は誰がするの?

Q.ルート証明書とSSL証明書の違いは?

ルート証明書は、最上位の認証局が発行した証明書。
SSL証明書は、サーバー証明書。SSL/TLS通信と公開鍵の真正を保証するための証明書。

https://www.digicert.co.jp/welcome/pdf/wp_sslandroot-certificate.pdf

感想

  • ディジタル署名とディジタル証明書はセットで学習した方が良い

おすすめ文献

dexcterdexcter

疑問

クライアント証明書は「ユーザが正規の利用者であることを認証」と聞いたが、公開鍵証明書と仕組み(証明書の発行、認証方法)は同じなのか?

基本的な流れは同じ。

証明書の発行手順

  1. 利用者が鍵を生成
  2. 利用者がCSR(X509証明書発行要求)を作成 - CSRの作成に秘密鍵を利用
  3. 認証局がCSRに署名して、公開鍵証明書(クライアント証明書)を作成

https://www.simpletraveler.jp/2021/09/23/client-certificate-authorization-part1-overview-certificate-creation/
https://qiita.com/mitzi2funk/items/602d9c5377f52cb60e54#3-クライアント証明書

クライアント証明書を用いた認証

Certificate

証明書または証明書チェーンを送るメッセージ。

Certificate Request

サーバからクライアントに証明書を要求するメッセージ。
サーバは受け入れ可能な公開鍵証明書に関する情報を提示する。

Certificate Verify

Client Hello~ClientKey Exchangeまでのやり取りをハッシュ化したメッセージを秘密鍵(証明書に載っている公開鍵のペアんの秘密鍵)で署名したメッセージ。

Certificate Verifyの詳細

クライアント証明書で認証する時、フィッシング詐欺などの攻撃者が用意したサイトに送った場合、証明書を複製して不正認証されることはないのか?

証明書は複製可能だが、秘密鍵を入手できない限り証明書を複製しても不正認証に使うことはできない。

dexcterdexcter

サーバ認証

サーバ認証とは?

SSLハンドシェイクの一種で、サーバ証明書を使う認証モード。

SSLハンドシェイクの流れ

ClientHello

利用可能な暗号スイートを提示する。(その他の情報も送る。)
送る情報は以下の通り。

  • SSL/TLSバージョン(クライアントが対応しているもっと高いバージョン)
  • 現在時刻
  • ClientRandom
  • セッションID
  • 利用できる暗号化方式
  • 利用できるハッシュ化方式
  • 利用できる圧縮方式

ServerHello

ClientHelloで提示されている暗号スイートの中からサーバが利用できる暗号の中で一番高いものを選択し、返す。
また、共通鍵作成に使用する「server random」という乱数も送る。

Certificate

証明書または証明書チェーンを送るメッセージ。

ClientKeyExchange

サーバ証明書に入っている公開鍵で、共通鍵の元(pre_master_secret)を暗号化して送る。

ChangeCipherspec

ネゴシエートを済ませた暗号アルゴリズムと暗号鍵を、以降の通信で利用することを相手に通知する。
ハンドシェイクではない。

サーバー証明書を用いてサーバが本物であるかどうやって確認するの?

図の通り、署名前署名書のハッシュ値と署名値のハッシュ値を比較することで、証明書が改竄されていないことが確認できる。ハッシュ値が一致しない場合は、クライアントのブラウザに警告が表示される。

EVSSL認証、企業証明書、ドメイン認証って何?

https://qiita.com/miyuki_samitani/items/91badfc8594b4ec9c5df

dexcterdexcter

SSL/TLS

データの暗号化

データを送信する時の暗号化の流れ。
1.元データを分割し、圧縮。
2. 圧縮したデータをMAC鍵で暗号化し、MAC値を追加。
3. データフラグメントとMAC値をセッション鍵で暗号化。
※MAC鍵、セッション鍵はSSLハンドシェイクで作成。