2016年2月17日水曜日

Webサービスにおける暗号化の基本 / 電子証明書

mainpic

引き続き暗号化に関しての記事を書いていきます。

前々回の記事では共通鍵と公開鍵の話をまとめました。

前回の記事ではデジタル署名に関しての話をまとめました。

しかし、どちらの技術を利用したとしても受信者が意図した受信者であること送信者が意図した送信者であることを確認することができず、「なりすまし」の脅威を排除するには至りませんでした。

それは、自分が情報を送受信したい本来の相手が持っている秘密鍵が、送受信時に利用されている鍵と同じ鍵か、というのが自分には分からないためです。

さて、どのように解決をするのか、まとめてみました。


Webサービス開発における暗号化の基本

第三回目の今回は、

  1. 共通鍵暗号化方式
  2. 公開鍵暗号化方式
  3. デジタル署名(電子署名)
  4. 電子証明書(今日はここまで)
  5. 認証局
  6. オレオレ証明書
  7. SSLの仕組み

今日は電子証明書について書いていきます。
認証局についても多少触れますが、詳細は次回に。


電子証明書

これまでの技術で問題となっているのは公開鍵が本人のものかどうか分からないということでした。

公開鍵暗号化方式では、受信者が公開鍵を送信者に渡します。この公開鍵が本当にあなたの友人のものであったり、あなたの取引先のものであったりが何らかの方法で確証が取れれば、データの送信を迷いなく行うことが出来ます。

デジタル署名では、送信者が公開鍵を受信者に渡します。この公開鍵が本当にあなたの友人のものであったり、あなたの取引先のものであったりが何らかの方法で確証が取れれば、データを受け取った時に付いている署名を信じて、送信者が送った内容を正しく判断することが出来ます。

電子証明書とは

この公開鍵が本人のものかの確証のことを電子証明書と言います。第三者によるお墨付きと言えるかもしれません。

実はブラウザやメーラーなどには標準である程度の電子証明書が組み込まれています。

sample

詳しくは後で説明をしますが、ここに登録されているような機関が中心となって電子証明書を発行しています。

このお墨付きを与える第三者機関のことを認証局と呼びます。

先に電子証明書とはどういったモノなのかを知っておきましょう。

電子証明書の規格はX.509という仕様になります。拡張子は.pem.der.crt.cer.pfx.p12などがあるようです。

私が扱ったことがあるのは、crt, p12くらいですが。
azureを利用するときにはp12をを求められることが多いです。

内容は、バージョン、シリアル番号、署名アルゴリズム(CAがつけたデジタル署名のアルゴリズム)、発行者有効期間、公開鍵の所有者情報、公開鍵、拇印(認証局のメッセージダイジェスト)、拇印アルゴリズム(認証局のメッセージダイジェストのアルゴリズム)…などです。

興味のある方はご自身の環境で確認してみてください。
chromeの場合は、右上の → 設定 → 詳細設定を表示… → 証明書の管理 → 信頼されたルート証明機関 → いずれかを選択 → 詳細
で確認できます。

この電子証明書に対して認証局がデジタル署名を行います。(そのため電子証明書の内容には、拇印と拇印アルゴリズムがあります。)

 

少しややこしくなってきましたね。

単純に電子証明書が転がっていたとしても、それが正規の認証局によって本人の確証が得られたモノなのかが分かりません。

なので、認証局が電子証明書にデジタル署名をすることによりこの電子証明書は認証局が認めたモノですというのを示しています。

この認証局がデジタル署名をするときにに、電子証明書に対してハッシュ関数(拇印アルゴリズム)を適用し、メッセージダイジェスト(拇印)を電子証明書に収めます。

これで内容の改ざんを防ぎます。

さらに、この拇印に対して署名アルゴリズムを適用し、署名を行っています。

 

これで、Webサイト等の公開鍵をもらうときには以下の流れで確証を得ることが出来ます。

  1. Webサイト等から電子証明書を受取る
  2. 電子証明書に付いている署名を確認する。
  3. 署名と認証局の公開鍵を使い拇印を取得する。
    (署名アルゴリズムの適用)
  4. 拇印からハッシュ値を取得する。
    (拇印アルゴリズムの適用)
  5. 電子証明書自体に拇印アルゴリズムを適用しハッシュ値を得る。
  6. 4.と5.のハッシュ値を比較し、内容が正しいことを確認。
  7. 認証局により認められたWebサイトの公開鍵を取得!

 

では電子証明書を取得するにはどうしたら良いのでしょうか。


電子証明書の取得

電子証明書は認証局が発行するモノです。電子証明書にはあなたが作成した秘密鍵に対する公開鍵を含める必要があります。

そのため、認証局に公開鍵とともに申請を行い、発行してもらいます。

まず、鍵のペアを作成します。(認証局のWebページ上から必要な情報を入力すると作成してくれるサービスを提供している認証局もあります。)

macやlinuxであれば

$ openssl genrsa 2048 > my.key

これで2048bitのRSAの秘密鍵が出来上がります。
もし公開鍵も同時に作りたい場合は以下のコマンドを実行します。

余談ですが、鍵を使ったssh接続をするときはこちらのコマンドを使いますね。

$ ssh-keygen -t rsa

すると次のような質問が出てくるので、必要な箇所を埋めていきます。

$ Enter file in which to save the key (defaultpath):
$ Enter passphrase (empty for no passphrase):
$ Enter same passphrase again:
$ Your identification has been saved in defaultpath/id_rsa.
$ Your public key has been saved in defaultpath/id_rsa.pub.

これで秘密鍵と公開鍵が得られます。(id_rsaが秘密鍵、id_rsa.pubが公開鍵)

この公開鍵を認証局に渡すのですが、私がこれまで電子証明書をもらうときは直接渡すのではなく、署名リクエスト(CSR: Certificate Signing Request)を作成し送っています。

このCSRの作り方はこのコマンドを実行します。

openssl req -new -key my.key > my.csr

また色々入力を求められるので埋めます。

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

これでmy.csrを使って認証局に証明書を作成してもらえるようになりました。

これを認証今日のWebページから送信すると後日証明書を受取ることが出来るようになります。

今日は以上です!次回は認証局に関してまとめていきます。
では、良いインプットと良いプログラミングを。

0 件のコメント:

コメントを投稿