2016年3月12日土曜日
クライアント証明書を基礎から学んだ
その前にあまりサーバ証明書についてもよくわかってなかった
まず単語の定義がOSやディストリビューションによって同じものを違う名称で扱うから混乱。
ここの記事が参考になる
http://www.penlabo.net/archives/488
オレオレ認証局(オレオレCA)は以下の流れで作成できる
http://d.hatena.ne.jp/ozuma/20130511/1368284304
中はバイナリみたいになっていて、
これで内容を確認できる。中は以下
作成したサーバ証明書はwindowsサーバのIISなら以下のサイトが参考になる。
https://www.ssloff.com/members/knowledgebase.php?action=displayarticle&id=29
Linuxは調べていないけど、たぶんApacheとかに設定入れるんでしょう
以下はオレオレCAがサインするときの流れ。
テキストエディタに貼り付け、それぞれ任意のファイル名(拡張子: *.cer)で保存
これを前述のwindowsのIISに追加してやる
http://www.nslabs.jp/pki-client-certification-with-nginx.rhtml
ユーザの公開鍵、秘密鍵といったものはわざわざ用意&CAが受け取る必要はない。
なぜならCA側でクライアント証明書の署名要求が作成できるから。
(以下では、CSRファイルがnewreq.pemという名前になっているのに注意)
そのサーバーが信頼しているCAか否かで決まる
じゃあ中間CAで作ったクライアント証明書は、ルートCAがサーバーに信頼されていたら
通過しちゃうの???という疑問はあるけど、よくわかっていない(調べてもいない)
クライアント証明書を認証すると、サーバー側の環境変数に
「SSL_CLIENT」から始まる一連の変数で
クライアント証明書の内容を参照することができる。
phpを使っていたら
まず単語の定義がOSやディストリビューションによって同じものを違う名称で扱うから混乱。
ここの記事が参考になる
http://www.penlabo.net/archives/488
オレオレサーバ証明書を作成
オレオレ認証局(オレオレCA)は以下の流れで作成できる
http://d.hatena.ne.jp/ozuma/20130511/1368284304
- サーバー上で「秘密鍵」と「公開鍵」をつくって、公開鍵+秘密鍵のハッシュをガッチャンコした「CSRファイル(署名要求)」を作る。
- 「CSRファイル」をCA(普通はVerisignとか)に持って行く
- 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.crtCA証明書の(—–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'])とかすると面白いぞ
登録:
投稿 (Atom)