今さらきけない、SSL証明書
執筆にあたり
個人的に「なんとなく理解しているけど、いざ人に説明しようと思うと困る」シリーズであるSSL証明書。自分自身の勉強も兼ねて、なるべく簡単な言葉で概要をおさらいしていきたいと思います。
なぜSSL証明書が必要なのか
SSL証明書は、主にウェブサイトとユーザー間の通信を保護するための鍵となる役割を果たします。
主な役割は以下の通りです。
通信を暗号化する
インターネット上では、ユーザーの入力したデータ(パスワードやクレジットカード情報など)がサーバーに送信される際、第三者に盗聴されるリスクがあります。
SSL証明書を使うと、これらのデータが「デジタル署名」を使って、ユーザ本人(クライアント)と該当サーバしか中身がわからないような仕組み(秘密鍵と公開鍵)で暗号化されるため、たとえ盗み見られても第三者が解読することはできません。
※ デジタル署名の仕組みは長くなりそうなので割愛します・・・
なりすまし防止
SSL証明書を使うことで、ユーザーはドメインと通信先のサーバが一致することが確認できます。
たとえば、Google検索(www.google.com)がメンテナンスでサーバ停止(あり得ませんが・・・)したとします。この時、悪い奴が同じドメイン名で(https://www.google.com)別のサーバを起動/公開してGoogle検索になりすまそうとしたとします。
しかしながら、このなりすましサーバは、該当ドメイン(www.google.com)のSSL証明書を持つことができません。SSL証明書を取得するためには、証明書発行機関の審査を通る必要があるため、このような偽装サイトは、GoogleのSSL証明書を取得することができません。これにより、ブラウザ上で”信頼されていないサイト”として扱われ、「これは怪しいサイトだな」ということが簡単に認識できるようになります。
信頼性の向上
SSL証明書によって「このウェブサイト(運営者)は怪しくない」ということをある程度証明することができます。証明の種類にはいくつかあり、下にいくにつれて信頼度が高くなります。また、証明書を作成するのにかかる費用も高額になっていきます。
- ドメインの所有者と証明書の申請者が一致している正規のサイトだよ(ドメイン認証:DV)
- ちゃんと法的に実在する企業が所有するドメインだよ(組織認証:OV)
- 世界的な認証ガイドラインに基づき、厳密に認証されたドメイン・企業だよ(拡張認証:EV)
証明書の種類
例えば、ZennのSSL証明書をブラウザ(GoogleChrome)で確認してみると、以下のようにSSL証明書は階層構造になっていることがわかります。
SSL証明書は、上位の証明書が次の証明書に署名し、次の証明書がさらにその次の証明書に署名するという信頼の連鎖(トラストチェーン)で成り立っています。例えば、もし上記のような階層構造の中間に挟まっている証明書(WE1)が抜けていたり、最上位の証明書(GTS Root4)が無かったりした場合、この階層構造が崩壊してしまい「zenn.dev」ドメインは認証されません。認証されない場合、ブラウザにエラー画面が表示され、サイトにアクセスできなくなります。
証明書同士が連鎖する仕組みとしては以下の通りです。
- 「zenn.dev」(SSL証明書)は、サーバーからセットで送られてきた「WE1」(Google Trust Servicesの証明書)によって署名されていることが検証できます。
- 次に「WE1」(中間CA証明書)は「GTS Root R4」によって署名されていることが検証できます。
- 最後の「GTS Root R4」(ルート証明書)は、PC(自身の端末)の中から見つけ出されることで、最終的に「GTS Root R4」によって「zenn.dev」ドメインのSSL証明書が正当なものであることが検証できます。
※ 自分のmacbookに確かに存在していることを確認
それぞれの証明書の役割について、詳しくみていきます。
ルート証明書
全ての証明書の「親」にあたる証明書で、信頼の起点にあたるものです。そのため、他の認証局から署名されるわけではなく自己署名(自分自身で正当性を証明している)となります。そのため、信頼度の高い認証局(有名なとこだとDigiSertとかGlobalSignとか)が発行したものが使われています。
ルート証明書はOS側で保管・管理されており、主要なルート証明書はPC出荷時にプリインストールされています。そのため、PC使用開始時から証明書を使用した安全な通信が行えています。
また、ルート証明書の有効期間はPCなどのハードウェアのライフサイクルと紐付くため、非常に長いことが特徴です(10年とか20年とか)。
中間CA証明書
中間CA証明書はルート証明書とサーバ証明書の橋渡しの役割を行う証明書です。
通常、ドメインに対して1〜2個の中間CA証明書が設定されています。
「そもそも、ルート証明書がサーバ証明書を直接署名すれば、中間CA証明書はいらないのでは?」
と感じます。技術的にはルート証明書とサーバ証明書だけでも署名は可能なのですが、運用面でのリスク回避・管理効率UPのために中間CA証明書は存在しています。
例えば、あるルート証明書で署名したサーバ証明書を大量に失効する必要が出てきた場合、サーバ証明書を1つ1つ全部失効するか、もしくは無数に存在するPC・スマートフォンのルート証明書を削除する必要があります。ルート証明書は有効期間が非常に長いため、時間が経つにつれて署名されるサーバー証明書の数が膨大になり、このような失効処理時の影響が大きくなります。
そのような影響拡大を抑えるため、ルート証明書よりも短い有効期間をもつ中間CA証明書を挟むことで、ルート証明書への依存を減らし、管理の柔軟性を高めているというわけです。
ルート証明書とサーバ証明書だけに意識がいきすぎて中間CA証明書の所在を忘れてしまい、繋がらなくなった場合に原因に辿り着けないケースがしばしばあるようです。
SSL証明書
特定のドメイン名が記載されたサーバー証明書を使っているサーバーと通信していることを保証します。一般的に「SSL証明書を購入する」という行為はこのサーバー証明書を認証局から発行してもらうことを指し、URLが「https://」で始まるウェブサイトは、サーバ証明書を使っているサイトであることがわかります。
役割としては上で記載したことと重複しますが、以下の通りです。
- 通信の暗号化
- なりすまし防止
- ドメインの信頼性の担保
まとめ
SSL証明書の役割と、SSL証明書を構成する3つの証明書についてまとめました。
「SSL証明書」「中間CA証明書」「ルート証明書」いずれか1つが欠けても安全な通信は成り立たないということですね。通信規格や署名方式の解説についてはかなり省いてしまいましたので、いずれそういったところもまとめてみたいと思います。
※ 認識違いや間違いなどあればコメントで教えてください・・・!
Discussion