公開鍵暗号の登場により、キーを増やすことなく多数の人の間で暗号化、復号化ができるようになった。さらに暗号化の仕組みを逆に用いることで、データの作り手が本人であることを証明する、電子署名が利用できるようになった。

データの作り手が本人である、というのは何を意味するだろうか。それは、ある公開鍵に対応する秘密鍵を、そのデータの作り手が所有しているということである。しかしその秘密鍵の所有者が Alice であると名乗っているとして、その名乗っている者が本当に僕らの友達である東京都中央区日本橋一丁目に住む、一年前にカリフォルニアから引っ越してきた 25歳の Alice であるかどうかまではわからない。

それを確実にするには、Alice 本人から直接、公開鍵をもらう必要がある。だから、公開鍵暗号を使うには、暗号化通信をする人々の間でそれぞれ、信頼できる方法で公開鍵を交換することになる。直接の知り合いでない人とも暗号をやりとりするには、どうすればいいだろうか。実はこれが、公開鍵暗号の最大の弱点なのだ。

公開鍵への署名 - 証明書

Alice と Bob が友達で、Bob と Carol も友達だが、Alice と Carol はお互いを知らないものとする。あるとき Carol から Alice に、パーティーへの招待状が届いた。招待状には Carol の署名がついている。Carol のホームページで公開されていた公開鍵でそれを検証すると、招待状の署名は無事検証に成功した。

しかし、Carol のものであるように見えるホームページは、本当に Bob の友達の Carol なのだろうか。偽物である可能性はないだろうか。Carol のものだと言われている公開鍵が、本当に Bob の友達の Carol のものだと確信するためには何が必要だろうか。

そこで使われるのが、公開鍵への署名である。Carol の公開鍵に Bob が署名すれば、少なくとも Bob がその公開鍵を信用していることになる。Alice は Bob の公開鍵で署名を検証すればいい。

この、公開鍵に他者の署名をつけたものを、証明書という。通常は、この公開鍵が誰のものであるかを表す氏名や組織名などのメタデータを付加する。

草の根で作る証明書 - Web of trust

証明書に付ける署名は複数でも良い。パーティーで Carol と友達になった Alice は、Carol の証明書に署名を追加した。これで Carol の証明書は、Alice の友達と Bob の友達から検証できるようになった。このように実際の人間関係を利用して証明書の検証範囲を広げていく方式は Web of trust(信頼の輪)と呼ばれている。

1991年に公開された PGP(Pretty Good Privacy)は、この考え方を実装したものである。メールの暗号化に使われていたが、2021年現在、暗号化コミュニケーション手段としては普及しておらず、オープンソースソフトの配布時に署名を付ける程度の利用にとどまる。ユーザが何も考えなくても利用できる HTTPS などとは異なり、IT技術者にとっても難解である PGP の概念を理解し、セキュリティの専門家にとっても煩雑である運用を乗り越えないと実現できない Web of trust は、振り返ってみれば失敗するのは必然だっただろう。一般ユーザにとっての実用性が低いという事情を反映してか、主要メールソフトでもサポートされなかった。もっとも、Windows 95 の登場とともに爆発的に一般に広がったウェブでも、HTTPS による暗号化が気にされるようになったのは 2010年頃からである。

しかし、もし Alice が超人気者で、数万人、数百万人の人が Alice の署名を信じるような状況であれば、どうなるだろうか。

PKI - Public key infrastructure

PKI(Public Key Infrastructure)は意図的に、多数の人が信じる署名を作り出している。まず、世界で数億人、数十億人の人が信じる、世界の頂点に立つ秘密鍵、公開鍵のキーペアを作る。世界の頂点なので、この証明書に署名できる人はどこにもいないから、仕方なく自分の秘密鍵で署名して、証明書としての形式を整える。この行為を自己署名という。作られた証明書を、ルート証明書と呼ぶ。ルートとは、木の幹の意である。

ルート証明書(公開鍵)を、全世界の人に配布して、それを信じるようにと通達する。Bob の証明書を全世界の人が信じるためには、ルート証明書(公開鍵)と対になる秘密鍵で署名すればいい。この署名を実施する組織を、Certificate Authority(通称CA)と呼ぶ。全世界の人が信じる CA によって、あらゆる証明書に署名するこの中央集権的な仕組みを PKI という。

実際には、ルート証明書は200前後が使われている。Windows、Mac、iOS、Android などの主要OS や、Chrome、Safari などの主要ブラウザには、あらかじめこの 200前後のルート証明書が設定されていて、暗号化通信をするときに相手方の証明書をこれらのルート証明書で検証している。

さて、ルート証明書(に対応する秘密鍵)で署名すると書いたが、実際にはルート証明書(に対応する秘密鍵)は使わない。ルート証明書(に対応する秘密鍵)で署名した別の証明書を作り、その別に用意した証明書(に対応する秘密鍵)で、顧客から依頼された証明書に署名している。これを中間証明書(intermediate certificate)と呼ぶ。

ルート証明書 <-------- 中間証明書 <-------- Bobの証明書
            署名検証             署名検証

Bob の証明書を提示された Alice は、中間証明書で検証すればいいことを知る。中間証明書そのものを信用していいかどうかはわからないが、中間証明書はルート証明書で検証すればいいことを知る。ルート証明書は OS やブラウザの「信用してもいい証明書一覧」に載っているので、署名検証の連鎖により Bob の証明書が信頼できることがわかる。