2014-09-11

Apache on CentOSでクライアント証明書認証を設定

まずは、apacheとmod_sslのインストール
yum install httpd mod_ssl

次に、証明書の準備
ここでは、オレオレ証明書で準備(-daysを3650日の10年にセット)
openssl genrsa 2048 > /etc/httpd/conf/server.key
openssl req -new -key /etc/httpd/conf/server.key -subj "/C=JP/ST=Tokyo/L=my city/O=my company/CN="`hostname` > /etc/httpd/conf/server.csr
openssl x509 -days 3650 -req -signkey /etc/httpd/conf/server.key < /etc/httpd/conf/server.csr > /etc/httpd/conf/server.crt

そして、クライアント証明書の検証のため

を発行したCA局の公開鍵を/etc/httpd/conf/cacert.pemに設置

デフォルトで用意される/etc/httpd/conf.d/ssl.confには色々と長ったらしく書かれているけれど

次の内容で置き換え

とりあえず、ここでは

SSL_CLIENT_S_DN_CN

の値を用いて、これがUser1かUser2の場合のみアクセスを許可するという設定

他に利用できる値は

http://httpd.apache.org/docs/2.2/mod/mod_ssl.html
を参照

Listen 443 https

SSLSessionCache  shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin


LogFormat "%h %l %{SSL_CLIENT_S_DN_CN}x %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" ssl_access
ErrorLog logs/ssl_error_log
CustomLog logs/ssl_access_log ssl_access
LogLevel warn

SSLEngine on
SSLProtocol all -SSLv2
SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/server.key
SSLCACertificateFile /etc/httpd/conf/cacert.pem
SSLVerifyClient require
SSLVerifyDepth 10


SSLRequire %{SSL_CLIENT_S_DN_CN} in {\
"User1",\
"User2"\
}


BrowserMatch "MSIE [2-5]" \
  nokeepalive ssl-unclean-shutdown \
  downgrade-1.0 force-response-1.0


ここまで設定したらhttpdを起動してとりあえずクライアント証明書がインストールされたブラウザでアクセスしてみる
service httpd start
すると、利用するクライアント証明書を聞かれるので選択

これで/var/log/httpd/ssl_access_logにSSL_CLIENT_S_DN_CNの値が出力されるので

適宜SSLRequireのところの許可リストをいじってあげればOK

0 件のコメント:

コメントを投稿