ApacheでSSLを有効化
created 12/19/2008 by Kuniyoshi Hiraoka
ApacheでSSLを利用するにはSSLのベースプログラムと、そのベースプログラムとApacheをつなぎあわせるモジュールが必要です
今回はベースプログラムにOpensslを、モジュールにmod_sslを使用しました
Red Hat Enterprise Linux 5をインストール時に既にmod_sslとOpensslはインストール済みでした
また、Apacheは既にインストール済みという前提になっています(versionは2.2.10)
Apacheのインストールはこちら http://www.palmyra.ne.jp/technical_memo/apache_php_postgres.html
1. Opensslのインストール
Opensslがインストールされているか確認します
# rpm -aq | grep openssl
openssl-0.9.8b-8.3.el5(0.9.8はバージョン)などと表示されればインストールされています
なければ、RED HAT ENTERPRISE LINUX 5のインストールDVD1のserver/openssl-0.9.8b-8.3.el5.i386.rpmをインストールします
# tar zxvf php-5.0.4.tar.gz
# ln -s php-5.0.4 php
2. Openssl-develのインストール
Openssl-develがインストールされているか確認します
# rpm -aq | grep openssl
openssl-devel-0.9.8b-8.3.el5(0.9.8はバージョン)などと表示されればインストールされています
なければ、RED HAT ENTERPRISE LINUX 5のインストールDVD1のserver/openssl-devel-0.9.8b-8.3.el5.i386.rpmをインストールします
ApacheでSSL通信するには、この開発ライブラリが必要となります
3. mod_sslのインストール
mod_sslがインストールされているか確認します
# rpm -aq | grep mod_ssl
mod_ssl-2.2.3-6.el5(2.2.3はバージョン)などと表示されればインストールされています
なければ、RED HAT ENTERPRISE LINUX 5のインストールDVD1のserver/mod_ssl-2.2.3-6.el5.i386.rpmをインストールします
mod_sslはApache本体とバージョンを合わせます
4. mod_sslの有効化
まずmod_sslが有効になっているか確認します
# /usr/local/apache2/bin/httpd -l
mod_ssl.cがあればモジュールは組み込まれています
なければ、Apacheをオプション--enable-ssl付きでコンパイルし直さないといけません
# cd /usr/local/src/httpd
# ./configure --enable-ssl
# make
# make install
5. Openssl-perlのインストール
http://www.aconus.com/~oyaji/www/certs_linux.htmを参照
プライベートCA用の秘密鍵と証明書をCA.pl(opensslのスクリプト)を使用して作成します
RedHat系の場合は、openssl-perlがインストールされていないとスクリプトが使用できません
# rpm -aq | grep openssl-perl
openssl-perl-0.9.8b-8.3.el5(0.9.8はバージョン)などと表示されればインストール済みです
なければ、RED HAT ENTERPRISE LINUX 5のインストールDVD1のserver/openssl-perl-0.9.8b-8.3.el5.i386.rpmをインストールします
6. openssl.cnfの編集
# vi /etc/pki/tls/openssl.cnf
#nsCertType = server → nsCertType = server 頭のコメントを外します
#nsCertType = sslCA, emailCA → nsCertType = ssICA, emailCA 頭のコメントを外します
[CA_default]
dir = ../..CA → dir = ./CA
7. CA.plの編集
# vi /etc/pki/tls/misc/CA.pl
$DAYS = "-days 1095";←サーバ証明書の有効期限を変更
} elsif (/^-xsign$/) {
system ("$CA $DAYS -policy policy_anything -infiles newreq.pem");
$RET=$?;
} elsif (/^(-sign|-signreq)$/) {
system ("$CA $DAYS -policy policy_anything -out newcert.pem " .
"-infiles newreq.pem");
$RET=$?;
print "Signed certificate is in newcert.pem\n";
} elsif (/^(-signCA)$/) {
system ("$CA $DAYS -policy policy_anything -out newcert.pem " .←system (...の3行に$DAYSを追記します
"-extensions v3_ca -infiles newreq.pem");
$RET=$?;
print "Signed CA certificate is in newcert.pem\n";
$CATOP="../../CA";→$CATOP="./CA";←ディレクトリを変更します
8. 各種証明書等を作成する際の作業用ディレクトリを作成
9. プライベートCA用の秘密鍵と証明書を作成
作業用ディレクトリに移動します
# cd /usr/local/certs
# /etc/pki/tls/misc/CA.pl -newca
CA certificate filename (or enter to create)
[Enter]を入力
Making CA certificate ...
Generating a 1024 bit RSA private key
.................++++++
.................++++++
writing new private key to './CA/private/cakey.pem'
Enter PEM pass phrase:xxxxx[Enter] ← CA用パスフレーズ入力(画面上何も変化はないが処理されています)
Verifying - Enter PEM pass phrase:xxxxx[Enter] ← CA用パスフレーズ再入力
-----
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[Enter] (国コード)
State or Province Name (full name) [Berkshire]:Osaka[Enter] (都道府県名)
Locality Name (eg, city) [Newbury]:Osaka[Enter] (市町村名)
Organization Name (eg, company) [My Company Ltd]:Palmyra[Enter] (組織名)
Organizational Unit Name (eg, section) []:Admin[Enter] (組織内ユニット名)
Common Name (eg, your name or your server's hostname) []:www.abc.ne.jp[Enter] (組織/サーバ名)
Email Address []:palmyra@abc.ne.jp[Enter] (管理者メールアドレス)
------------------------以下はopenssl-0.9.8xの場合--------------------------------
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:[Enter]のみ入力
An optional company name []:[Enter]のみ入力
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:xxxxx[Enter] ← CA用パスフレーズ入力
Check that the request matches the signature
Signature ok
これでCA用秘密鍵(cakey.pem)とCA用証明書(cacert.pem)が作成されます
10. サーバ用CA証明書(cacert.crt)を作成(openssl-0.9.8xの場合)
openssl-0.9.8xの場合、サーバで使用するためにCA証明書(cacert.crt)だけを切り出しておきます
# openssl x509 -in ./CA/cacert.pem -out ./CA/cacert.crt
openssl-0.9.7xの場合はcacert.pemのまま使用できます
11. サーバ用秘密鍵(newkey.pem)を作成
**サーバ証明書を作成する場合、CA証明書とサーバ証明書のON(Organization Name)は、異なる名称にしないとうまく動作しないので注意が必要です**
# /etc/pki/tls/misc/CA.pl -newreq-nodes
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
.........++++++
..............++++++
writing new private key to 'newkey.pem'
-----
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[Enter] (国コード)
State or Province Name (full name) Some-State]:Tokyo[Enter] (都道府県名)
Locality Name (eg, city) []:Edogawa[Enter] (市町村名)
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Palmyra Network[Enter] (組織名)
Organizational Unit Name (eg, section) []:Admin[Enter] (組織内ユニット名)
Common Name (eg, your name or your server's hostname) []:www.abc.ne.jp[Enter] (ホスト名:*)
Email Address []:palmyra@abc.ne.jp[Enter] (管理者メールアドレス)
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:[Enter] ← Enterのみ入力
An optional company name []:[Enter] ← Enterのみ入力
Request is in newreq.pem, private key is in newkey.pem
*ここのホスト名は、必ずhttps://・・・・等、アクセスする時のホスト名にします
12. サーバ用証明書(newcert.pem/server.crt)を作成
認証局の証明書とキーを使って、リクエストファイルからX.509サーバ証明書の作成と署名を行います
# /etc/pki/tls/misc/CA.pl -sign
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for ./CA/private/cakey.pem:xxxxx[Enter] ← CA用パスフレーズ入力
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number:
b9:27:18:0b:ac:12:d7:b1
Validity
Not Before: May 24 12:05:30 2006 GMT
Not After : May 24 12:05:30 2007 GMT
Subject:
countryName = JP
stateOrProvinceName = Osaka
ocalityName = Osaka
organizationName = Palmyra Network
organizationalUnitName = Admin
commonName = www.aconus.com
emailAddress = oyaji@mail.aconus.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
FA:CF:7E:2C:F7:DA:81:38:3D:C4:ED:5E:50:D5:52:8A:EF:F6:EB:8A
X509v3 Authority Key Identifier:
keyid:B6:F1:C9:30:A8:E5:22:AE:B6:DA:16:E3:9D:7B:EC:CD:21:2C:22:17
Certificate is to be certified until May 24 12:05:30 2007 GMT (365 days)
Sign the certificate? [y/n]:y[Enter]
1 out of 1 certificate requests certified, commit? [y/n]y[Enter]
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
13. サーバ証明書(server.crt)だけを切り出す
# openssl x509 -in newcert.pem -out server.crt
# tar zxvf postgresql-8.0.2.tar.gz
# ln -s postgresql-8.0.2.tar.gz postgresql
14. httpd.confを編集
# cd /usr/local/apache2/conf
# vi httpd.conf
# Secure (SSL/TLS) connections
Include conf/extra/httpd-ssl.conf
ここの行のコメントアウトを外します
15. httpd-ssl.confを編集
先ほど作成したserver.crtとnewkey.pemをコピーします
# cp /usr/local/certs/CA/private/server.crt /usr/local/apache2/conf
# cp /usr/local/certs/CA/private/newkey.pem /usr/local/apache2/conf
# cd /usr/local/apache2/conf
# vi httpd-ssl.conf
DocumentRoot
ServerName
ServerAdmin
を適切に設定します
SSLCertificateFile "/usr/local/apache2/conf/server.crt
SSLCertificateKeyFile "/usr/local/apache2/conf/newkey.pem
とそれぞれ設定します
16. Apacheを再起動
# /usr/local/apache2/bin/apachectl restart
ブラウザにhttps://localhostと入力し、It works!と表示されればOKです
■CA証明書をブラウザにインポートする方法■
https接続の度に警告メッセージが表示されないようにします
1. ca.derファイルの作成
# openssl x509 -inform pem -in ./CA/cacert.pem -outform der -out ./CA/ca.der
2. クライアント配布用CGIの作成
# cd /usr/local/apache2/cgi-bin
# vi ca
#!/bin/sh
echo "Content-type: application/x-x509-ca-cert"
echo "Content-Disposition: attachment; filename=ca.der"
echo
cat ca.der
保存します
3. パーミッションの設定
.derファイルをコピーします
# cp -p /usr/local/certs/CA/ca.der /usr/local/apache2/cgi-bin
オーナーを変更しパーミッションを設定します
# chown apache:apache /usr/local/apache2/cgi-bin/ca.der
# chmod 755 /usr/local/apache2/cgi-bin/ca
# chown apache:apache /usr/local/apache2/cgi-bin/ca
4. .derファイルの配布
http://192.168.10.170(ホスト名 or IPアドレス)/cgi-bin/caにアクセスし、ca.derをダウンロードします
5. 証明書のインストール
ダウンロードしたca.derを右クリックし、「証明書のインストール」を選択します
■https接続のみ許可する方法■
webページにアクセスする時https接続のみ許可するようにします
1. httpd.confの編集
# cd /usr/local/apaceh2/conf
# vi httpd.conf
#AllowOverride controls what directives may be placed in .htaccess files....の下の
AllowOverride None→AllowOverride All
に変更します
2. .htaccessファイルの作成
https接続のみさせたいファイルがある該当ディレクトリに移動します
ここでは例としてユーザのホームディレクトリを指定します
# cd /home/userdir/public_html
# vi .htaccess
これでhttp://server/~user/public_htmlではForbiddenと表示され
https://server/~user/public_htmlではページが表示されます
以上です