🐡

HTTPS通信/SSLサーバ証明書、そろそろちゃんと理解する。

2023/05/03に公開3

まえがき

なんとなくでHTTPS通信の仕組みは理解してるつもりだった(´_ゝ`)
しかし自分の言葉でうまく説明できないのが現状であったため、勉強用にこの記事をまとめることにした。

この記事にまとめていること
✅SSLサーバ証明書、どうやってつくるの?
✅SSLサーバ証明書、どうやって検証してるの?
✅"証明書ツリー"って何?
✅中間証明書とは?なんで必要なの?

SSLサーバ証明書とは

SSLサーバ証明書とは「SSLによる暗号化通信」と「Webサイトの運営者の身元証明」の2つの機能をあわせ持つ電子証明書のこと。インターネットで第三者に公開するには必須となる。

まずはサーバ証明書を実際に見てみる

どのページでもいいので↓の🔒アイコンより参照可能。

"zenn.dev"のサーバ証明書

"qlita.com"のサーバ証明書

「証明書の階層」とは?

↑のように、SSLサーバ証明書は複数の証明書がツリー構造で紐づく形になっている。

ルート証明書
   ↑
中間証明書
   ↑
SSLサーバ証明書

この構造を「証明書チェーン」という。

名称 役割
ルート証明書 ルート認証局が自ら作成した"オレオレ証明書"。一番偉い。正しい。正義。
中間証明書 ルート認証局(ルート証明書)に身元を保証された証明書。
SSLサーバ証明書を署名/保証することができる。
SSLサーバ証明書 ルート証明書/中間証明書に身元を保証された証明書。

中間証明書、いらなくね?

極論なくても成立する。ルート証明書とサーバ証明書だけで。
あえて中間証明書をはさんでいる理由は管理を分散させたいから。

例) 1つのルート証明書で、1000個のサーバ証明書を保証する。
  → サーバ証明書Aに不備があったので、全PCが持つルート証明書を入れ直し。
  → サーバ証明書Aを使っていない人達もルート証明書を差し替える必要がある。

例) 10個の中間証明書で、それぞれ100個のサーバ証明書を保証する。
  → サーバ証明書Aに不備があったので、サーバ証明書Aを保証した中間証明書Aを
    各PCに対して更新する必要あり。
  → 中間証明書Aだけを更新。他の9個の中間証明書は更新する必要なし。

✅サーバ証明書を作成するときは、Amazonのような中間認証局に対してサーバ証明書の作成を依頼する。
✅PCのトラストストアには、Amazonのルート証明書(公開鍵付き)があるので、この公開鍵でサーバ証明書の署名を検証する。

参考:サーバー証明書/中間CA証明書/ルート証明書の違いとは?

サーバ証明書の検証の流れ

下記の記事がとても分かりやすかったので参考までに。

https://blog.serverworks.co.jp/server-cert-verification#検証の具体例

  1. サーバ証明書を取得👉【サーバ証明書+上位の証明書】をセットで取得する。
  2. ルート証明書の公開鍵が改ざんされていないことを確認👉「サーバ証明書に紐づくルート証明書の公開鍵」と「PCのトラストストアにあるルート証明書の公開鍵」が等しいことを確認。
  3. ルート証明書が改ざんされていないことを確認👉ルート証明書の署名を、今回取得したルート証明書の公開鍵で復号できること&ハッシュ値が同じことを確認。
  4. 中間証明書が改ざんされていないことを確認👉中間証明書の署名を、ルート証明書の公開鍵で復号できること&ハッシュ値が同じことを確認。✅中間証明書がもつ公開鍵が正しいことの実証👍
  5. サーバ証明書が改ざんされていないことを確認👉サーバ証明書の署名を、中間証明書の公開鍵で復号できること&ハッシュ値が同じことを確認。✅配布されたサーバ証明書が信頼している認証局によって署名済であることの実証。

HTTPS通信が確立されるまで

・TCPハンドシェイク = TCPコネクションを確立
・サーバ証明書を取得 (中間証明書/ルート証明書も一緒に取得)
・サーバ証明書を検証
・サーバ証明書の公開鍵で共通鍵を生成&サーバへ送信
・サーバは秘密鍵で共通鍵を復号✅これでクライアント/サーバで同じ鍵を共有した状態に。

SSLサーバ証明書の作成フロー

ルート証明書

中間証明書

✅中間認証局は↓ルート証明書で作成された証明書で、サーバ証明書を作成する。
 - 俺 → AWS に「サーバ証明書作ってくれ」と依頼。
 - AWSは「中間証明書の秘密鍵」でサーバ証明書を作成。

サーバ証明書

オレオレ証明書

オレオレ証明書がダメな理由

あとで読む↓

http://takagi-hiromitsu.jp/diary/20071125.html

オレオレ証明書を使う場面

👉社内向けのWEBサイト公開(インターネット公開しない)

https://developers.gmo.jp/14928/

あとで試してみたいこと

Apache on EC2に対して証明書を設定。

https://dev.classmethod.jp/articles/amazonlinux-apache24-ssl/

AWS ELBに対して証明書を設定。

AWS CloudFrontに対して証明書を設定。

Discussion

angel_p_57angel_p_57

なんとなくでHTTPS通信の仕組みは理解してるつもりだった(´_ゝ`)

基本的に出回ってる情報はほぼデマなので、単に情報整理しても理解には結びつきません。
実際この記事でも「SSLサーバ証明書とは」「サーバ証明書の検証の流れ」「HTTPS通信が確立されるまで」ほぼほぼ間違いです。
まずは情報を鵜呑みにする前に、どうすればウラがとれるのかを気にした方が良いと思います。

なお、「オレオレ証明書がダメな理由」ですが、「当然」と言えるようでなければ理解したとは言えないと思います。
※証明書の役割を正しく把握していれば、オレオレ証明書があり得ないことは言うまでもないことなので

crsc1206crsc1206

基本的に出回ってる情報はほぼデマなので、単に情報整理しても理解には結びつきません。

ご指摘ありがとうございます...!
おっしゃる通りネットにある情報を参考にしているので、学習本買うなどして理解を改めます。

angel_p_57angel_p_57

おっしゃる通りネットにある情報を参考にしているので、学習本買うなどして

私の言ってる「出回ってる情報」は、別にネット限定ではないですよ。書籍もほぼ信用できません。理由は簡単で、書いている人自身がウラを取っていない、理解して書いてない、伝言ゲームしている、そんなところです。
ただ、通称「暗認本」は数少ない例外で、信用して問題ないでしょう ( ただそれでも「ウラをとる」という姿勢は捨ててはいけません )
あとは、プロフェッショナルSSL/TLSも、流石に専門で扱ってるので大丈夫かとは思いますが、かなり内容が細かいので、概要を掴むのに向いているかは不明です。