以下は、某メルマガに書いた記事です。
オリジナルはこちら

httpsのプロトコル(通信手順)解説の2回目です。
「2回目なのになぜその12?」と思われた方はhttpsその1から順にご覧ください。
予備知識だけでその1~その10までの10回分の解説が必要になっています。

今回もお楽しみください。

今回は、httpsの通信手順(プロトコル)解説の続きとなります。

通信手順といってもそんな難しいことをやっているわけではあり
ません。いつも言っているようにコンピュータ同士でチャットの
ようなものです。チャットと言ってわかりにくければショート
メッセージによる会話のようなものです。

そのチャットの中でお互いに必要な情報をやりとりします。
httpsの場合であれば、「あんただれ?」とか「俺は暗号方式○○
か△△が使えるんだけど、そっちは?」などというやりとりを
するわけです。

このやりとりが終われば、実際に取り決めた内容に応じて目的
の通信を始めます。

この前段のやりとりの部分は「TLSハンドシェイク」と呼ばれ
httpsのキモとなる部分なのですね。


1. TLSハンドシェイク
-----------

前回のおさらいになりますが、httpsでは次の順でやりとりを行い
ます。

1. TLSハンドシェイク
 1.1 ご挨拶
 1.2 サーバ証明書の検証
 1.3 (クライアント証明書の検証)
 1.4 鍵交換
 1.5 暗号化通信への移行
2. 暗号化した状態でのhttp

このうち、「1.1 ご挨拶」を前回解説しました。

httpsは「安全なhttp」が目的です。安全を担保するには通信の
方式や暗号化の方式を決めるだけではなく、通信相手がホンモノか
どうかを見極めなければなりません。

今回は通信相手を見極めるための「1.2 サーバ証明書の検証」に
ついて解説します。


2. サーバ証明書の検証
-----------

前回と同じですが、用語の確認です。

クライアント: 
 今からサーバにつなぎたいコンピュータ。
 一般的には家庭にあるPCのブラウザがクライアントとなります。
 以下の図中ではこれを[ク] と記載します。
サーバ:
 一般的にサーバとは単体で使うことを目的とせず、他の利用者や
 コンピュータにサービスを提供するコンピュータのことです。
 ここでは、httpsでの通信を提供しているコンピュータを指し、
 多くの場合、ブラウザでアクセスする先のWebサイトとなります。
 以下の図中ではこれを[サ] と記載します。

httpsでご挨拶が終わり、どんな暗号方式を使うのかといった
やりとりが終わると、次にサーバからサーバ証明書がクライアント
に送られます。

そのやりとりはものすごくシンプルで、サーバからクライアントに
ServerCertificateというメッセージを送るだけです。

サーバ証明書を受け取ったクライアント側は、その内容が正しいか
どうかを検証します。


3. サーバ証明書
--------

サーバ証明書というのは、要は電子証明書です。

電子証明書については、httpsその7~10の4回に分けて解説
しました。

とまあ、マジメに書くと4回分位になるややこしいものですが、
端的に書くと、「サーバ側から伝えたい情報(公開鍵やURLなど)に
対して、証明機関という民間の組織が「署名」という行為を行って
作られた小さなデータ」です。
公開鍵ってナニ?とか証明機関ってナニ?署名って?という方は
以下のバックナンバーをご覧ください。

httpsその5(公開鍵暗号方式1)
  https://archives.mag2.com/0001678731/20181112064000000.html
httpsその6(公開鍵暗号2)
  https://archives.mag2.com/0001678731/20181119064000000.html
httpsその7(電子証明書1)
  https://archives.mag2.com/0001678731/20181126064000000.html
httpsその8(電子証明書2)
  https://archives.mag2.com/0001678731/20181203064000000.html
httpsその9(電子証明書3)
  https://archives.mag2.com/0001678731/20181210064000000.html
httpsその10(電子証明書4)
  https://archives.mag2.com/0001678731/20181217064000000.html

ちなみに「がんばりすぎないセキュリティ」ではバックナンバーは
全て公開しています。
ホントは1年以上前の情報は古すぎて時代に合わない可能性が高く
なるため、古い記事は非公開としたいところですが、そういうこと
はできませんので、全公開としています。

さて、サーバ証明書というのは、形式は上述のとおり電子証明書
そのものです。

その中には、
1)サーバが使う公開鍵暗号の公開鍵
2)サーバが自己申告する情報
3)上記の2つが改竄(かいざん)されていないことの署名
  ※署名とは、手書きのサインのことではなく、特定の計算を
   行った値のことです。
の3つのデータが入っています。

サーバ証明書の検証とは、サーバが自己申告する情報を検証する
ことに他なりません。


4. サーバが自己申告する情報の検証
-----------------

さて、サーバが自己申告する情報は以下が典型的です。

1)サーバの所属する組織名
2)サーバのドメイン名

また、証明機関が付加した以下の情報も検証に使います。

1)サーバ証明書を発行した証明期間名
2)サーバ証明書の署名
3)サーバ証明書の有効期間

確認することはいろいろありますので、順に説明します。

なお、それぞれの詳細な解説は上述のバックナンバーで行って
いますので、そちらをご参照ください。


5. 証明機関の確認
---------

最初にクライアントが知っている証明機関かどうかを確認します。
各ブラウザにはあらかじめ、著名な証明機関の証明書(ルート証明
書またはルートCA証明書)が組み込まれています。

ここに含まれていない証明機関による署名が付いている場合は、
そのままでは信頼して良いのかどうかが判断できませんので、通常
は「信頼できない証明書です」といったエラーになります。

ここで問題がなければ、次の署名の確認を行います。


6. 署名の確認
-------

署名の正しさを確認する方法については、電子証明書の解説で書き
ましたが、おさらいしておきます。

証明書はデータ部と署名部の二部構成となっています。
署名部にはデータ部を特定の方法でかきまぜてハッシュ値という値
を求め(ハッシュ関数というもので生成します)それを証明機間の
秘密鍵で暗号化したデータが入っています。

データ部を変更した時は、署名も変更が必要です。
データ部は誰でも変えられますが、署名には証明機関の秘密鍵が
要りますから、証明機関でないと変えられません。
ですから、署名が正しければデータ部が変更されていないと言える
わけです。

署名を確認する方法ですが、署名を作る時と同じ方法でハッシュ値
を得ます。
次にサーバ証明書にある署名を証明機関の公開鍵(これはあらか
じめブラウザに登録されています)を使って暗号を解きます。
この両者が一致していれば、データ部が改竄されてないと言える
というわけです。

署名が一致しなければ、証明書として信頼できませんから、https
としての通信は行えません。
ブラウザでは「不適切な証明書です」といったエラーとなります。

署名が確認できれば、次はサーバが自己申告した情報の確認を行い
ます。


もう少しサーバ証明書の確認については解説することがあるの
ですが、さすがに長くなってきましたので、途中ですが、今回は
ここまでといたします。

次回はこの続きと、クライアント証明書の解説をします。

次回もお楽しみに