クライアント証明書を要求するサイトの構築(Apache+OpenSSL)
名前は聞いたことあっても何だか良く分からなかったOpenSSL。
そんなOpenSSLを突然使うことになり構築するまでのメモ。
会社にて
ひろす > 仕事が無い!仕事! 部長 > じゃあ、鍵が無いとアクセス出来ないサイトを構築してー ひろす > はい、やります!
こうして証明書認証が必要なサイトを構築する事に。(←検証用に使うため?)
それで調べてみたらOpenSSLを使えば良いらしい(´・ω・`)
サーバOSの指定は特に無かったので、一番好きなCentOSで。
クライアントOSはWindows。
# cat /etc/redhat-release CentOS release 5.6 (Final) # uname -r 2.6.18-238.9.1.el5
結局OpenSSLって何?
おなじみのwikipediaによると...
OpenSSLは、SSLプロトコル・TLSプロトコルのオープンソースな実装である。
まあ、良くわかんないんだけどさ、SSLとTLSの暗号機能を提供してくれるツールなのかな?
多分あれだよ、あれ。
Amazonとかのショッピング中とかアカウントサービスの時にhttpsでセキュアに接続できてるあれ。
とにかくやってみる
とりあえず、OpenSSLをインストールする必要がある。
でもデフォルトで入ってるんじゃね?とか思ってコマンドを叩いてみる。
# yum list | grep openssl openssl.i686 0.9.8e-12.el5_5.7 installed openssl-devel.i386 0.9.8e-12.el5_5.7 installed openssl.i386 0.9.8e-12.el5_5.7 base openssl-perl.i386 0.9.8e-12.el5_5.7 base openssl097a.i386 0.9.7a-9.el5_4.2 base xmlsec1-openssl.i386 1.2.9-8.1.2 updates xmlsec1-openssl-devel.i386 1.2.9-8.1.2 updates
なんか色々入ってた。
コマンドラインでもopensslコマンドが効いてるみたい。
ネットでの調べによるとopensslだけだとダメらしい。
ApacheにSSLを使えるようにするモジュールmod_sslが必要らしい。
考えなしにコマンドを打ってみる。
# yum list | grep mod_ssl mod_ssl.i386 1:2.2.3-45.el5.centos.1 installed
あれ(・・;)?入ってる。
入ってなかった時は以下のコマンド。
# yum install mod_ssl
認証局(CA)の秘密鍵(ca.key)と署名要求書(ca.csr)を作る
まずは作業フォルダへ移動。
# cd /etc/httpd/conf
認証局の秘密鍵作成に必要な乱数データ(rand.dat)を作成する。
# openssl dgst -md5 /var/log/messages > rand.dat
もしくは
# dd if=/dev/random of=rand.dat count=1
認証局の秘密鍵(ca.key)と署名要求書(ca.csr)を生成する。
# openssl req -new -keyout ca.key -out ca.csr -rand rand.dat Generating a 1024 bit RSA private key ....++++++ ...................................++++++ writing new private key to 'ca.key' Enter PEM pass phrase: (パスワードを入力) Verifying - Enter PEM pass phrase: (もう一度同じパスワードを入力) ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:JP State or Province Name (full name) [Berkshire]:Tokyo Locality Name (eg, city) [Newbury]:Chiyoda Organization Name (eg, company) [My Company Ltd]:Cybozu_CA Organizational Unit Name (eg, section) []:QA Common Name (eg, your name or your server's hostname) []:cybozu-ca.com Email Address []:root@cybozu-ca.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: (何も打たずにEnter) An optional company name []: (何も打たずにEnter)
認証局(CA)の証明書(ca.crt)を作成
CAの秘密鍵(ca.key)と署名要求書(ca.csr)を使って証明書(ca.crt)を作成。-days 365 で一年。
# openssl x509 -req -signkey ca.key -in ca.csr -days 365 -sha1 -out ca.crt Signature ok subject=/C=JP/ST=Tokyo/L=Chiyoda/O=Cybozu_CA/OU=QA/CN=cybozu-ca.com/emailAddress=root@cybozu-ca.com Getting Private key Enter pass phrase for ca.key: (ca.keyのパスワードを入力)
サーバの秘密鍵(server.key)と署名要求書(server.csr)を作成
サーバの秘密鍵(server.key)と署名要求書(server.csr)を生成する。
# openssl req -new -keyout server.key -out server.csr -rand rand.dat -nodes Generating a 1024 bit RSA private key ...++++++ ............................++++++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [GB]:JP State or Province Name (full name) [Berkshire]:Tokyo Locality Name (eg, city) [Newbury]:Chiyoda Organization Name (eg, company) [My Company Ltd]:Cybozu_Server Organizational Unit Name (eg, section) []:QA Common Name (eg, your name or your server's hostname) []:(実際に使用するサーバのホスト名) Email Address []:server@cybozu-server.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: (何も打たずにEnter) An optional company name []: (何も打たずにEnter)
サーバの証明書(server.crt)を作成
認証局の証明書(ca.crt), 秘密鍵(ca.key), サーバの署名要求書(server.csr)を利用してサーバの証明書(server.cst)を作成
# openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -days 365 -sha1 -in server.csr -out server.crt Signature ok subject=/C=JP/ST=Tokyo/L=Chiyoda/O=Cybozu_Server/OU=QA/CN=cybozu-server.com/emailAddress=server@cybozu-server.com Getting CA Private Key Enter pass phrase for ca.key: (ca.keyのパスワードを入力)
ユーザに配布する証明書ファイルを作成
サーバの秘密鍵(server.key)と証明書(server.crt)と認証局の証明書(ca.crt)をpkcs#12(*.p12)形式でまとめる。
# openssl pkcs12 -export -inkey server.key -in server.crt -certfile ca.crt -out server.p12 Enter Export Password: Verifying - Enter Export Password: (パスワードを入力)
権限も変更しておく。
# chmod 400 server.* ca.*
Apacheの設定
/etc/httpd/conf.d/ssl.confファイルを編集する
# vim /etc/httpd/conf.d/ssl.conf
ここの部分を編集
・84行目付近 DocumentRoot "/var/www/html" ・85行目付近 ServerName サーバのホスト名:443 ・112行目付近 SSLCertificateFile /etc/httpd/conf/server.crt ・119行目付近 SSLCertificateKeyFile /etc/httpd/conf/server.key ・134行目付近 SSLCACertificateFile /etc/httpd/conf/ca.crt ・141行目付近 SSLVerifyClient require SSLVerifyDepth 1
Apacheの再起動
設定の変更を適応させるためにApacheを再起動させる
# /etc/init.d/httpd restart
証明書ファイルをドキュメントルートに配置
server.p12ファイルを/var/www/htmlにコピー
# cp -rp server.p12 /var/www/html
アクセス権の変更
# chown apache.apache /var/www/html/server.p12
これで http://ホスト名/server.p12 にアクセスすれば証明書をダウンロードできる。
※クラインアトPCでダウンロードしたら削除推奨
httpsを設定したサーバにアクセスしてみる
Internet Explorerでhttpsにアクセスしてみた。
証明書をインポートしていないので、表示できない(`・ω・´)シャキーン
証明書のインポートはダウンロードしたserver.p12ファイルをダブルクリックで指示に従えばよし。
あとはhttps:443にしかアクセスさせたくない!とかならばiptablesを弄ってhttp:80をアクセス拒否すればいい。