クライアント認証をもう一度やる@nginx

TOC

概要

前回は、資料のようにやればできるって感じだったけど、
理解して一つづつもう一度やってみたかったのでもう一度やってみた。

やったこと

基本的には以下のサイトにしたがってすすめた。
こちらのサイト
基本的に前回の記事では、CA(.sh) という、
openssl の ca を扱うのに便利な付属スクリプトは使っていなかったんだけど、
今回のは CA(.sh) を使ってすすめた。
というか、ほとんどやったことは上記のサイト通りなので、上記のサイト通りやると良いとおもう。
解説もものすごく丁寧にされているので。
なので、自分がやったことの補足だけ書いていく。

補足

config による直接的な制限

まず、背景として、vimtaku, hogetaku というユーザにそれぞれクライアント認証したい。
それで、それぞれのクライアントの鍵はサーバで作成する。

なので、サーバ側で

  • クライアント用(vimtaku,hogetaku二人別々)の公開鍵と秘密鍵を作り、
  • csr をだし、
  • それを ca が 署名して、
  • pfx に変換して

最終的に、配りたい対象ユーザのブラウザに渡すかんじになった。

client認証はしていて、さらに config レベルで、アクセスを制限したい場合には、 ssl.conf に

<Location />
SSLRequire (    %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
            and ( \
                  %{SSL_CLIENT_S_DN_CN} eq "vimtaku" \
                  or %{SSL_CLIENT_S_DN_CN} eq "hogetaku" \
                ) \
            )
</Location>

などと書けば設定できる。

他にも条件は書けそうなので、パラメータに関してはこちらを参考に。

デバッグとしては

CustomLog logs/ssl_request_log \
  "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x %{SSL_CLIENT_S_DN_O}x %{SSL_CLIENT_S_DN_CN}x %{SSL_CLIENT_S_DN}x \"%r\" %b"

としてログだすとよいかもしれない。

revoke による証明書の失効

config ではなく、 revoke で、たとえば hogetaku が会社辞めたとかで配った証明書を失効させる方法として、

cd /etc/pki/CA
cp serial crlnumber
openssl ca -gencrl -revoke  /etc/pki/CA/certs/hogetaku.ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com.crt -config /etc/pki/tls/openssl-client.cnf
cd /etc/pki/CA/crl/
openssl ca -gencrl -out crl.pem

として、

そして
/etc/httpd/conf.d/ssl.conf に、

SLCACertificateFile /etc/pki/CA/cacert.pem

の下くらいに

SSLCARevocationCheck chain
SSLCARevocationFile /etc/pki/CA/crl/crl.pem

を追加した。

それで、サーバを再起動すれば、revoke した証明書を持つクライアントはアクセスできなくなる(400)。

ちなみに revoke は /etc/pki/CA/newcerts/内のファイル か /etc/pki/CA/newcerts/certs 内のファイルのどちらでもよさそう。

nginx による、SSL 設定とクライアント認証

はっきり言ってなんの問題もない

sudo yum -y install nginx

/etc/nginx/conf を編集。

server {
        listen       443;
        server_name  localhost;

        ssl                  on;
        ssl_certificate      /etc/pki/CA/certs/ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com.crt.pem;
        ssl_certificate_key  /etc/pki/CA/private/ec2-xxxxxxxxxxxxx.ap-northeast-1.compute.amazonaws.com.key;
        ssl_verify_client on;
        ssl_client_certificate /etc/pki/CA/cacert.pem;
        ssl_crl /etc/pki/CA/crl/crl.pem;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1; 
        ssl_ciphers  HIGH:!aNULL:!MD5; 
        ssl_prefer_server_ciphers   on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

大体、 apache と同じような設定を行えば使用できる。

ちなみに

revoke したのをやっぱ辞めたいって場合は
/etc/pki/CA/index.txt の
R の行の R を V にして、 その次の次のカラムの 時間を 消してから、
openssl ca -gencrl -out crl.pem
してやればよい。

所感

複雑だけど、さすがに2週連続で日曜日使えばだいたいわかる。
でももっと奥深く知るにはちゃんと本を読むべきだと思う。

dev
このエントリーをはてなブックマークに追加