電子証明書の中身を覗いてみる(その1)

この記事はPDFファイルに電子署名をつけてみるの続きのおはなしになります。
今回は、PDFに手順に沿って電子署名をつけてみたけれど、「すくなくとも1つの署名に問題があります。」って表示されちゃう件についてだよね。
そうですね。どうしてこういう表示が出るのかは、電子証明書とAcrobat Readerの両方に関係しているけれど、それを知るには電子証明書とはどのようなものなのかの理解が不可欠です。それを知るために、今回は少し難しい内容を含みますが、電子証明書の中身を見てみるというお話をします。
Acrobat Readerの「署名パネル」ってとこをクリックするとなんか電子証明書の情報が見えているみたいだし、「証明書の詳細」っていうのをクリックすると、より詳しい情報が見えるけど、これとは違うの?
確かにその方法で扱っている電子証明書の情報の一部を見ることができますが、全部ではありません。今回は、ちょっとマニアックなやりかたですが、Linux OSなどで暗号化のファイルを取り扱うときに使うopensslというツールを使います。Windows OSでもプログラムをインストールすれば利用できますが、一般的には使うことのないツールなので、こんなものもあるんだ、こんなふうになっているんだ、という感じで見てください。
なんとなーく眺めるって感じでついていくっす。
このサイトをご覧の方の中で、やっぱり電子証明書の中身を見てみたいという方のためにopensslでどういうコマンドラインを指定すればいいのかをお示しすると、
openssl pkcs12 -in cert.p12 -info -legacy
となります。-in の後に指定しているcert.p12がセコムから買ってきた電子証明書のファイル名になるので、この部分はお手元の証明書のファイル名に合わせて変えてください。
opensslのコマンドって、実はインターネットのWebサイトを作るとき、SSL/TSL暗号化をするために使ったことがあるんだけど、-legacyってパラメータは初めてみたなあ。これって何?
なかなかマニアックな質問をぶつけてきましたね。これは、セコムが提供している電子証明書が、現在入手できるopensslでは非推奨になっている暗号化方式を使っていることが理由で、「旧タイプで非推奨の暗号化を使ったファイルだけど取り扱ってね」と指定するためのパラメータなんです。Acrobatの仕様なのか別の理由なのか、これはわたしにもわからないのですが、PDFファイルに署名をつけようとすると、旧タイプの暗号化方式を使った電子証明書でないと正しく処理ができないようなので、現状はこのようなことになっています。
そんな非推奨の暗号化方式を使うなんて、電子署名は安全性に問題があるんじゃないの、くわばらくわばら。
セキュリティリスクは全くないといえば嘘になりますが、暗号文をやりとりするというような使い方をするわけではないので、非推奨とされた理由に該当するような情報漏洩のリスクはないと考えて良いと思いますよ。
話を元に戻して、
この図が先ほど示したopensslコマンドで表示される内容となります。この証明書は大きく3つのブロックに分かれていて、一つ目には署名を付ける人の情報、このケースでは氏名とその人が行政書士であること、その行政書士の登録番号などが書かれています。

2番目のブロックでは、この証明書の発行者がSECOM Trust.net Co. Ltd.社であることなどが書かれています。

そして3番目に「ENCRYPTED PRIVATE KEY」つまり暗号化された秘密鍵が書かれているという構造です。

電子署名をつけるための電子証明書のブロック数は必ずしも3つとは限りませんが、大体の証明書には、最初に署名者、中間に発行者の情報、最後が秘密鍵という構成になっています。

この表示の中で、目で見て読むことができる情報はopensslコマンドがファイルの情報を解読して表示してくれているもので、証明書の本当の中身は、緑や赤の四角で囲った部分です。
秘密鍵っていうのは何かを暗号化するときに使う暗号鍵だよね。インターネットだとアクセスするユーザ側が公開鍵を持っていて通信文を暗号化して送り、受けるWebサイトがペアになる秘密鍵を持っていて、ペアになる秘密鍵をもっているWebサイトだけが暗号文の中身を読むことができる仕組みって聞いたけど。
その通りです。いろいろな人が決まったサイト、例えばUFJ銀行にアクセスするという状況で、UFJ銀行が持っている秘密鍵とペアになっている公開鍵さえ持っていれば、誰でも暗号化した通信分を送ることはできるけれど、中身を読めるのは秘密鍵を持っているUFJ銀行だけということができるわけです。UFJ銀行の利用者には自由に公開鍵をばらまいて使ってもらう、でも通信されている中身は誰でもが自由に見ることができないのです。
でも公開鍵がわかっちゃうと、それから、なんとか頑張って、秘密鍵を計算で出しちゃうってことはできないの?
非常に大きな数の素因数分解は難しく、それを元にして暗号技術ができているという話は聞いたことがあるんじゃないかと思います。公開鍵から秘密鍵を計算するのは大きな数の素因数分解の計算をするのと同じで、簡単には導き出せないことがこの技術のキーポイントなのですね。
ところで、あらかじめ決められた文章を秘密鍵で暗号化して、それを公開鍵で正しく復号化、つまり暗号文をほどくことができたとするとどういうことがいえるでしょうか?例えば、「ABCD」という文書が秘密鍵で暗号化されていて、それをUFJ銀行の公開鍵で読み取ることができた場合を考えてみてください。
ええっと、UFJ銀行の公開鍵で暗号文を読むことができたということだから、暗号化はその公開鍵とペアになっている秘密鍵でされたことになるな。つまり、暗号文を送ってきた相手はUFJ銀行ってことになる、ってことか。
その通りです。つまりこの暗号化の技術を応用して、自分が相対している相手を確かめることができるわけです。電子署名はこれを使って、TAKASHI IKEDAさんが自分の証明書に含まれている秘密鍵で暗号化したメッセージをPDFファイルに埋め込みます。受け取った側がTAKASHI IKEDAさんの公開鍵で復号化できたら、TAKASHI IKEDAさんが暗号文を埋め込んだPDFファイルであることを確認できるという、そのような仕組みになっているのです。
へえ、なるほど。でもTAKASHI IKEDAさんの公開鍵っていつ相手に配られるの?それにその公開鍵が偽物で、そのペアの秘密鍵がなりすましの者のだったら、本当にTAKASHI IKEDAさんの電子署名かどうかなんて怪しいよね。
そこで証明書の発行者の役割が出てくるわけですが、ここでちょっと休憩にしましょう。私もちょっとひまわりの種をついばんできたいと思います。
電子証明書の中身を覗いてみる(その2)に続く