電子署名(サーバー証明書)

 電子署名はHTTP通信の暗号化であるSSLやTLSを使う際に必要な「サーバー証明書(Server Certificate)」で20年以上前から使われています。

 署名リクエストの記事で「サーバー証明書はCertficate Authorityに署名された署名リクエストである」と言及しました。サーバー証明書というのは、CSR(署名リクエスト)に対して特定の秘密鍵を使って署名したX.509証明書です。X.509証明書というのは「証明される組織の名前や住所や連絡先と公開鍵」と「それを証明する組織の名前や住所や連絡先と公開鍵」が含まれます。これに対して特定(ブラウザには予め「これらは大丈夫な認証局」というリストが入っています)の認証局が「これは正しい情報ですよ」とお墨付きを与える署名をするとブラウザで「大丈夫なサイトです」と表示されます。

下記でサーバー証明書の内容をパースして閲覧しますが、サーバー証明書の取得方法としては「サーバー側に置いてあるもの」もしくは「ブラウザ等で取得する」の2種類があります。今回はあまり触れられない後者で行います。

1. サーバー証明書の取得

 ブラウザを使ってサーバーの証明書を取得するには、まずそのサーバーで配信されているウェブサイトをHTTPSで開きます。Chromeの場合、URLの左端に閉じた鍵🔐のアイコンがあるのでそれをクリックし、開いたメニューで「Certificate」そクリックします。開いた小さな画面で証明書のアイコンを選択してデスクトップにドラッグすればデスクトップにサーバー証明書が保存されます。弊社のサーバー証明書であればデスクトップに「electric-blue-industries.com.cer」というファイルが保存されます。

 上記のサーバ証明書はMacやWindowsに標準装備されたキーチェーン管理アプリではそのまま開けますが、PHPで処理をする際にはそのままではサーバー証明書とは認識されません。サーバー証明書として判別するヘッダーとフッターと64文字ごとの改行がないからです。そこで、下記のコードを使ってPHPで正常に判別されるための前処理を行います。

下記が上記の処理の結果で得たPHPのOpenSSLで処理できる弊社(electric-blue-industries.com)のサーバー証明書です。

上記から情報を抽出します。

その出力結果です。

 上記の上の方を見てもらうと弊社の情報が書かれているわけなのですが、弊社の住所も連絡先も書かれていないことがわかりますか?それでは、この「サーバー証明書」というのは何を証明しているものなのでしょうか?

 サーバー証明書は、暗号化通信に使われる公開鍵ペアの公開鍵について「この公開鍵はelectric-blue-industries.comというドメインがSSL/TLS通信をするうえで使用するものであると証明します by 認証局」というだけのものであって、そのドメインの管理者の住所が正しいとか、公的機関が安全と認めたとかの証明ではないのです。

2. 自己署名または認証局ではない署名がされたサーバ証明書は「危険」なのか?

 結論から言うと「一概に危険とは言えない」です。このサーバー証明書にまつわるリスクは主に「なりすまし」であり、例えばapple.comのサーバ証明書を誰でも作って自分のサイト(例 sagidayo.apple.com)にインストールしてapple社管轄のサイトであるようになりすませたというケースです。これを防ぐために認証局(Certificate Authority)が存在しているのであって、自己署名または認証局ではない署名がされたサーバ証明書が危険というのは「公開鍵の証明」という本来の趣旨とは解離があると考えます。

 数年前からGoogle Chromeでは、予めGoogleが登録した認証局ではない誰かが署名したサーバー証明書がSSL/TLS通信に使われている場合「このサイトは安全ではありません」と画面表示をするようにしていますが、正直これはやりすぎだと私は考えています。


 私たちが当たり前に使っているブラウザの暗号通信でも電子署名は重要な要素となっています。

0
Would love your thoughts, please comment.x
()
x