done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

調べるたびに忘れるので、オレオレ証明書についてまとめたい。あるいは、CとかOとかOUとかCNって何?という話

注意: 以下は筆者の理解を書きますが、筆者はセキュリティなどに関して素人同然なので、記事内容の真正性について保証しません。自己責任でご参照くださるか、参照に示したJPNICのサイトでも見てください。

動機

最近Kubernetesを勉強しているのですが、ひょいひょいクライアント認証とかでこのあたりの技術が出てくるので調べてみました。

調べてわかったことは、オレオレ証明書とは


グレンラガンだということです。

お前を信じるお前を信じろ!

PKIとはなにか

Public-Key Infrastructure のこと。公開鍵暗号を使った認証基盤を指す。あるAさんが、Bさんのことを信頼できるか検証する際、Aさんがすでに信頼している第三者がBさんのことを保証してくれるかどうかで確認する仕組み。

コレ自体は証明書の実装について示したものではなさそう。

公開鍵暗号は、よくSSHとかで使うやつ(雑すぎる理解)

WebのSSL/TLSに使われているものと思えば良さそう。というか、題名に書いたCとかOとかもそれ関連の話によく出てくる印象。

X.509とかRFC3280とかもこれ。

CAとはなにか

PKIで用いられる証明書はCA: Certified Authority から発行される。CAというのが、信頼できる第三者Windowsとかには確かこれがすでに入っている。Firefoxとかは独自のCAリストを持っていたような。 ユーザは、自分が信頼しているCAが発行した証明書は信じる(ここ重要)

PKIは、TLSもそうだけど、S/MIMEというプロトコルで電子メールでも使える。電子メールの署名の正しさをこれで検証できる。

ユーザはCAに証明書を発行してもらい、それをアプリケーションで利用する。CAは同様に証明書とそれに対応する暗号化鍵を持っている。 ユーザはCAの証明書を参照することで、検証したい証明書の発行に使われた暗号化鍵が確かにそのCAのものであることを確認できる。

公開鍵暗号方式では、ある暗号化鍵で暗号化したものを、公開鍵で開けることができる、という特性を利用していると思われる。

上記のような理解をしていたが、どうやらちがうっぽい?このあたりは押さえておきたい。が、今は割愛。 qiita.com

ユーザはルートCAか、もしくはいずれかのCAを信頼し、そのCAが発行する証明書は正しいという前提で証明書を検証する。ルートCAが信頼しているCA "X" も、 CA "X" が信頼している CA "Y" も信頼する。

ユーザが信頼しているCAはトラストポイント(信頼点)と呼ばれる。

で、CとかOとかOUとかCNってなによ

X.509で使われる証明書の中に記載される名称。DN (Distinguish Name) 、識別名とも呼ばれる。

  • C: Country そのまま国の名前
  • O: Organization 組織名
  • OU: Organizational Unit 部門名
  • CN: Common Name 一般名

これはSubjectやIssuerに書かれるものである。つまり、Issuer (証明書を発行したCA)や証明されている人間(Subject) に付与された識別名。

証明書の検証手順

  • Issuerの値(発行体の名称)をもとに、CA証明書を入手
  • CA証明書のIssuerの値をもとに、そのCA証明書を発行しtあCAの証明書を入手
  • CA証明書入手を繰り返し、トラストポイントまでたどり着いたら検査完了

次に、証明内容を検査

  • CAに含まれる公開鍵で、認証対象の証明書の電子署名を検証
  • 名称、有効期限、鍵の用途が受け入れられるかを検証
  • 証明書が執行していないかを検証 (CRLに入っていないかどうかを確認)

で、オレオレ証明書とは

俺がトラストポイントになることだ・・・っ!

ということで、自身の証明書を自分の秘密鍵で署名して、さらに用意した自前の認証局の公開鍵をインストールすることでトラストポイントにもなることだと理解した。

参照

coreos.com www.nic.ad.jp