2016年3月12日土曜日

Blogger MarkDown記述

クライアント証明書を基礎から学んだ

その前にあまりサーバ証明書についてもよくわかってなかった

まず単語の定義がOSやディストリビューションによって同じものを違う名称で扱うから混乱。

ここの記事が参考になる
http://www.penlabo.net/archives/488

オレオレサーバ証明書を作成


オレオレ認証局(オレオレCA)は以下の流れで作成できる
http://d.hatena.ne.jp/ozuma/20130511/1368284304
  1. サーバー上で「秘密鍵」と「公開鍵」をつくって、公開鍵+秘密鍵のハッシュをガッチャンコした「CSRファイル(署名要求)」を作る。
  2. 「CSRファイル」をCA(普通はVerisignとか)に持って行く
  3. CAの秘密鍵で「CSRファイル」を「サイン」してサーバ証明書(拡張子がCRTとかになってる場合が多い)を生成

中はバイナリみたいになっていて、
openssl x509 -text 
これで内容を確認できる。中は以下
  • 証明書には以下の情報が入っている
  • サーバの情報(コモンネームとか、CSRファイル生成時に入力したやつ)
  • サーバの公開鍵
  • CA名
  • CA電子署名
  • 有効期限
  • 証明書の情報

作成したサーバ証明書はwindowsサーバのIISなら以下のサイトが参考になる。
https://www.ssloff.com/members/knowledgebase.php?action=displayarticle&id=29

Linuxは調べていないけど、たぶんApacheとかに設定入れるんでしょう


以下はオレオレCAがサインするときの流れ。

CA準備
/usr/lib/ssl/misc/CA.sh -newca

// CA証明書(自己署名済みの証明書)生成
// openssl req -new -x509 -newkey rsa:2048 -out cacert.pem -keyout private/cakey.pem -days 1825

サーバ証明書を署名
openssl ca -policy policy_anything -in /vagrant_data/hogehoge_csr.txt -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out /vagrant_data/hogehoge.crt
CA証明書の(—–BEGIN CERTIFICATE—–)から(—–END CERTIFICATE—–)までをコピーして
テキストエディタに貼り付け、それぞれ任意のファイル名(拡張子: *.cer)で保存

これを前述のwindowsのIISに追加してやる

オレオレクライアント証明書を作成

ここのサイトがとても参考になった
http://www.nslabs.jp/pki-client-certification-with-nginx.rhtml

ユーザの公開鍵、秘密鍵といったものはわざわざ用意&CAが受け取る必要はない。
なぜならCA側でクライアント証明書の署名要求が作成できるから。
(以下では、CSRファイルがnewreq.pemという名前になっているのに注意)
# 以下操作はroot権限でやってました
cd /etc/ssl/client
/usr/lib/ssl/misc/CA.sh -newreq-nodes
# これでnewreq.pemといったファイルが生成される

# 別のSSL設定ファイルを用意する
vim cert-client-req.cnf
# ここの内容は参考サイトを参照してください

# 既存のSSL設定ファイルと置き換え
cd /etc/ssl
mv openssl.cnf openssl_.cnf
mv client/cert-client-req.cnf openssl.cnf

# クライアント証明書生成
openssl ca -policy policy_anything -in client/newreq.pem -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out /path/to/your_directory/client.crt

# ここでDatabase Updateに失敗したら、/etc/ssl/demoCA/index.txtに同じものが入っているから消すこと
/path/to/your_directory/client.crt に生成されたこのファイルを、p12形式と呼ばれるものに変換したりして クライアントPCにインストールすると、 クライアント証明書を要求するサイトにアクセスすると、 ブラウザ上にダイアログが出てきて、証明書を選択することになる

クライアント証明書を受け取ったサーバ

クライアント証明書をブラウザから送信し、 サーバーが受け取ると、認証するか否か・・というのは
そのサーバーが信頼しているCAか否かで決まる

じゃあ中間CAで作ったクライアント証明書は、ルートCAがサーバーに信頼されていたら
通過しちゃうの???という疑問はあるけど、よくわかっていない(調べてもいない) 

クライアント証明書を認証すると、サーバー側の環境変数に
 「SSL_CLIENT」から始まる一連の変数で
クライアント証明書の内容を参照することができる。

phpを使っていたら
var_dump ($_SERVER['SSL_CLIENT_DN'])
とかすると面白いぞ