ぬけラボ

φ(..)メモメモ

クライアント証明書を要求するサイトの構築(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プロトコルのオープンソースな実装である。

まあ、良くわかんないんだけどさ、SSLTLSの暗号機能を提供してくれるツールなのかな?

多分あれだよ、あれ。
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だけだとダメらしい。
ApacheSSLを使えるようにするモジュール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 Explorerhttpsにアクセスしてみた。

証明書をインポートしていないので、表示できない(`・ω・´)シャキーン

証明書のインポートはダウンロードしたserver.p12ファイルをダブルクリックで指示に従えばよし。

あとはhttps:443にしかアクセスさせたくない!とかならばiptablesを弄ってhttp:80をアクセス拒否すればいい。