SSLサイトの構築
通常のwebサイトは、情報のやりとりを平文(暗号化されていない)で行います。
したがって、ネットワーク回線を盗聴すれば、全の情報を取得できます。
元々webサイトは、情報を不特定多数の人に発信するために考えられた技術なので、盗聴の心配をする必要がありませんでした。
しかし現在では、カード番号や暗証番号など他人に知られたくない情報をネットワークで扱う場面が増えています。
これらの問題を解決するために、SSL(Secure
Sockets Layer)を使ったwebサイトが誕生しました。
SSLサイトの作成
- SSLサイト用バーチャルサイトの定義ファイルの作成
SSLサイト用の定義ファイルを作成します。
Apache2をインストールした時点で下記ファイルが作成されています
これを元に筆者の環境に合わせる形で若干の変更を行いました
ファイル名:/etc/apache2/sites-available/default-ssl |
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/wwwssl/ ←/var/wwwssl/を新規に作成
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/wwwssl/> ←ここも上と同じように変更
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/ssl_access.log
combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
</VirtualHost>
</IfModule>
|
- SSLサイト定義ファイルとSSLモジュールの有効化
# a2ensite default-ssl
Enabling site default-ssl.
Run '/etc/init.d/apache2 reload' to activate
new configuration!
# a2enmod ssl
Enabling module ssl.
See /usr/share/doc/apache2.2-common/README.Debian.gz
on how to configure SSL and create self-signed
certificates.
Run '/etc/init.d/apache2 restart' to activate
new configuration!
これで、サイトのSSL化の準備は終わりです。
必要な公開鍵・秘密鍵もインストール時に準備済みです。
/var/wwwssl/へコンテンツファイルを置けばSSLサイトの完成です
新たに鍵を作成する場合
下記に設定する2つのファイルを作成する必要があります。
SSLCertificateFile ←公開鍵
SSLCertificateKeyFile ←秘密鍵
公開鍵は自身がCAとなり署名します。
証明書発行機関(CA)の構築
通常、証明書はベリサイン等の証明書発行機関(CA)に発行を依頼するのですが有料です。
貧乏サーバのため、第三者CAへの証明書発行依頼(有料)をあきらめ、自身で証明書を発行します。
そのために、CAを構築します。
- opensslの設定ファイルのを修正
/etc/ssl/openssl.cnfの修正 |
修正前 |
修正後 |
[ CA_default ]
dir = ./demoCA |
[ CA_default ]
dir = ./alkCA |
- 必要なディレクトリ・ファイルの作成
# cd /etc/ssl/
# mkdir ./alkCA
# cd alkCA
# mkdir ./certs
# mkdir ./private
# mkdir ./crl
# mkdir ./newcerts
# chmod 700 ./private ←秘密鍵が置かれるので他から見られないように
# echo "01" > ./serial ←シリアルの初期化
# touch ./index.txt ←証明書データベースの初期化
- 自己署名済みの証明書と秘密鍵を作成
# openssl req -new -x509 -newkey rsa:2048
-out ./cacert.pem -keyout ./private/cakey.pem
-days 3650←3650日有効な証明書を作成
./cacert.pem:CAの証明書ファイル
./private/cakey.pem:CAの秘密鍵
(CAは、要求があればこの秘密鍵を使って署名を行う)
Generating a 2048 bit RSA private key
...................................+++
..................................................+++
writing new private key to './private/cakey.pem'
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) [AU]:JP ←国コードを入力
State or Province Name (full name) [Some-State]:Osaka ←都道府県名を入力
Locality Name (eg, city) []:HigashiOsaka ←市区町村名を入力
Organization Name (eg, company) [Internet
Widgits Pty Ltd]:Yoppa ←会社名、団体名等を入力
Organizational Unit Name (eg, section) []:Hoge ←部門名・部署名等を入力
Common Name (eg, YOUR name) []:yoppa.yoppa ←URLを入力a
Email Address []:←何も入力しない
# chmod 600 ./private/cakey.pem ←他人から見られないように
- ブラウザ用証明書(der形式)への変換
ca_cert.pemをブラウザに組み込めるようにder形式に変換します
#openssl x509 -inform PEM -outform DER -in
./cacert.pem -out ./alkCAcert.der
alkCAcert.derをブラウザに組み込みます(次項)。
これをしないと、作成したSSLサイトへのアクセス毎に警告メッセージが表示されます。
(この項での作業の意味が無くなる)
- CA証明書のブラウザへの組み込み(WindowsXPの場合)
- 4 で作成したalkCAcert.derをWindowsPCへコピー
- alkCAcert.derをダブルクリック
- 証明書情報が表示されるので[証明書インストール]を押す
- 証明書のインポートウィザード画面を表示 [次へ]を押す
- 証明書のインポートウィザード:証明書ストア画面を表示 [次へ]を押す
- 証明書のインポートウィザード:完了画面を表示 [完了]を押す
- 証明書をルートストアへの追加確認画面を表示 [はい]を押す
- 終了画面を表示 [OK]を押す
これでCA証明書の組み込み終了です
秘密鍵と証明書要求(CSR)の作成
自サーバの秘密鍵と証明書要求(CSR)を作成します。
このCSRから先ほど構築したCAで証明書を作成します
# mkdir /etc/ssl/key
# cd /etc/ssl/key
# openssl req -new -keyout alk_key.pem -out
alk_csr.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Generating a 1024 bit RSA private key
...++++++
.......................++++++
writing new private key to './alk_key.pem'
Enter PEM pass phrase: ←パスワードを入力
Verifying password - 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) [AU]:JP ←国コードを入力JP
State or Province Name (full name) [Some-State]:Osaka ←都道府県名を入力
Locality Name (eg, city) []:HigashOsaka ←市区町村名を入力
Organization Name (eg, company) [Internet
Widgits Pty Ltd]:Yoppa ←会社名、団体名等を入力
Organizational Unit Name (eg, section) []:Hoge ←部門名・部署名等を入力
Common Name (eg, YOUR name) []:alk.dip.jp ←正確にドメイン名を入力しなければならない
Email Address []:←何も入力しない
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:←何も入力しない
An optional company name []:←何も入力しない
生成されたファイル |
内 容 |
備 考 |
alk_key.pem |
サーバーの秘密鍵 |
サーバが持つ秘密鍵ファイル
デフォルトで1024bitの鍵ファイルが作成される
デフォルト値は下記ファイルを修正することで変更可能
/etc/ssl/openssl.cnf |
alk_csr.pem |
証明書要求(CSR) |
CA機関への証明書要求ファイル
本来、ベリサイン(株)等の第三者CAに証明書を発行してもらう |
自サーバ公開鍵への署名
alk_csr.pemを自己CAで署名します。
# cd /etc/ssl
# openssl ca -out ./key/alk_cert.pem -infiles
./key/alk_csr.pem
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./alkCA/private/cakey.pem: ←CAのパスワードを入力
Check that the request matches the signature
Signature ok
Certificate Details:
Serial
Number: 1 (0x1)
Validity
Not
Before: Jan 19 07:52:37 2005 GMT
Not
After : Jan 19 07:52:37 2006 GMT
Subject:
countryName
= JP
stateOrProvinceName
= Osaka
organizationName
= Yoppa
organizationalUnitName
= Hoge
commonName
= alk.dip.jp
X509v3
extensions:
X509v3
Basic Constraints:
CA:FALSE
Netscape
Comment:
OpenSSL
Generated Certificate
X509v3
Subject Key Identifier:
43:EA:70:7E:9C:40:AF:1B:DC:B9:45:88:F0:5C:59:FF:78:C5:2B:A3
X509v3
Authority Key Identifier:
keyid:B0:A5:A5:F4:08:CD:83:20:D7:4B:7A:79:6C:63:EB:30:B4:72:9C:35
DirName:/C=JP/ST=Osaka/L=HigashiOsaka/O=Yoppa/OU=Hoge/CN=yoppa.yoppa
serial:DF:28:7C:A1:04:75:A9:50
Certificate is to be certified until Jan
19 07:52:37 2006 GMT (365 days)
Sign the certificate? [y/n]:y←yを入力
1 out of 1 certificate requests certified,
commit? [y/n]y←yを入力
Write out database with 1 new entries
Data Base Updated
最終的には次の2つのファイルを使用します
ファイル名 |
内 容 |
/etc/ssl/key/alk_cert.pem |
自己CAで署名された公開鍵 |
/etc/ssl/key/alk_key.pem |
秘密鍵 |
Apache2設定ファイルの修正
作成した公開鍵(alk_cert.pem)と秘密鍵(alk_key.pem)をApche2で使えるように修正します。
修正ファイル名:/etc/apache2/sites-available/ssl
<下記の記述を追加>
SSLCertificateFile /etc/ssl/key/alk_cert.pem
SSLCertificateKeyFile /etc/ssl/key/alk_key.pem
Apache2再起動時にパスフレーズを入力しない
これでSSLサイトとして機能します。
しかし、このままだとApache2を再起動する度にパスフレーズを聞かれます。
この方が安全なのですが、筆者は面倒なのがきらいなので、Apache2の再起動時にもパスフレーズを入力しないでも済むように変更します。
# cd /etc/ssl/key ←カレントディレクトリをSSL鍵の位置へ移動
# openssl rsa -in ./alk_key.pem -out ./alk_key_nopass.pem ←パスフレーズなしの鍵を作成:alk_key_nopass.pemが作成される鍵
Enter pass phrase for ./alk_key.pem: ←alk_key.pem作成時のパスワードを入力
writing RSA key
/etc/apache2/sites-available/sslファイルを変更
変更前 |
変更後 |
SSLCertificateKeyFile /etc/ssl/key/alk_key.pem |
SSLCertificateKeyFile /etc/ssl/key/alk_key_nopass.pem |
これで、Apache2を再起動させてもパスフレーズの入力は、必要なくなります。
|