====== Apache2 + PHP5 SSL Installation ======
Windows環境下でSSLを設定するステップを紹介する。
===== Prerequisite =====
SSLの環境を構築する為には次がセットアップされている必要がある。
- [[http://httpd.apache.org/download.cgi|Win32 Binary including OpenSSL 0.9.8m (MSI Installer)]]
===== example of openssl.conf =====
後で、サーバー証明書作成に必要な**%%openssl.conf%%**ファイルを作成しておく。
#
# SSLeay example configuration file.
# This is mostly being used for generation of certificate requests.
#
RANDFILE = .rnd
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
####################################################################
[ CA_default ]
dir = . # Where everything is kept
certs = $dir\certs # Where the issued certs are kept
crl_dir = $dir\crl # Where the issued crl are kept
database = $dir\index.txt # database index file.
new_certs_dir = $dir\newcerts # default place for new certs.
certificate = $dir\cacert.pem # The CA certificate
serial = $dir\serial # The current serial number
crl = $dir\crl.pem # The current CRL
private_key = $dir\private\cakey.pem # The private key
RANDFILE = $dir\private\private.rnd # private random number file
x509_extensions = x509v3_extensions # The extentions to add to the cert
default_days = 365 # how long to certify for
default_crl_days= 30 # how long before next CRL
default_md = md5 # which md to use.
preserve = no # keep passed DN ordering
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
# For the CA policy
[ policy_match ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ req ]
default_bits = 1024
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, your website's domain name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 40
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
[ x509v3_extensions ]
# under ASN.1, the 0 bit would be encoded as 80
nsCertType = 0x40
#nsBaseUrl
#nsRevocationUrl
#nsRenewalUrl
#nsCaPolicyUrl
#nsSslServerName
#nsCertSequence
#nsCertExt
#nsDataType
次は**%%openssl.conf%%**のパスを設定する。 パスを設定する前に、PHPが**%%openssl.conf%%**を探すロジックを知る必要がある。\\
PHPは以下のロジックにより **%%openssl.conf%%** を探す。
* 環境変数 **%%OPENSSL_CONF%%** が設定された場合、 設定ファイルの(ファイル名を含む)パスとして使用される。
* 環境変数 **%%SSLEAY_CONF%%** が設定された場合、 設定ファイルの(ファイル名を含む)パスとして使用される。
* ファイル **%%openssl.conf%%** はデフォルトの認証エリアに あることが仮定され、**%%openssl DLL%%** がコンパイルされた時間で設定される。 通常、デフォルトのファイル名が **%%c:\usr\local\ssl\openssl.conf%%** であることを 意味する。
===== 鍵のペア作成と証明書の作成 =====
SSLの通信で利用するには、公開鍵/秘密鍵のペアとデジタル証明書が必要である。\\
これらは、**%%OpenSSL%%**に付属するコマンドを利用し生成できる。\\
生成するファイルは、server.key(秘密鍵)、server.csr(CSRファイル:公開鍵+証明書申請情報)、server.crt(デジタル証明書)の3つとなる。\\
まず、**%%server.csr(CSRファイル:公開鍵+証明書申請情報)%%**の作成からはじめましょう。\\
**%%server.csr%%**の作成すると**%%privkey.pem%%**が一緒に作られる。これは後で**%%server.key%%**を作成するときに必要になる。\\
証明書を発行する際、
**%%「req_distinguished_name」%%**について、聞かれることになる。 その説明を簡単に次に示す。
^項目^詳細^
|Country Name|2文字の国コードを入力|
|State or Province Name|州、県の名前を入力(CAのように省略しない)|
|Locality Name|市の名前を入力|
|Organization Name|組織の名称を入力(特殊な文字はなるべく避ける &->and)|
|Organizational Unit Name|セクション名を入力|
|Common Name|サーバーの別名ではなく、セキュアサーバーの本当の名前(有効なDNS名)を入力|
|Email Address|Webマスターやシステム管理者の電子メールアドレスを入力|
設定例を次に示す。
C:\apache2.2\conf>\Apache2.2\bin\openssl req -config openssl.conf -new -out server.csr
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
....++++++
..++++++
writing new private key to 'privkey.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) []:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) []:Tokyo
Organization Name (eg, company) []:Example Inc.
Organizational Unit Name (eg, section) []:Baz Section
Common Name (eg, your websites domain name) []:www.example.com
Email Address []:master@example.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
ここで、CSRファイルを生成する際のオプションの意味は次の通りである。
^オプション^種類^意味^
|req|サブコマンド|CSRファイルの作成する。|
|-new|オプション|新規にCSRファイルを作成する。|
|-key 鍵|オプション|入力する秘密鍵のファイル名を指定する(パスフレーズ付きの鍵の場合は、パスフレーズが必要)。|
|-config opensslのcnfファイル|オプション|openssl.cnfのパスを指定する。|
**%%server.key(秘密鍵)%%**の作成\\
Apache起動時にパスフレーズの入力が求められるのを防ぐ為に、次のコマンドを実行する。
C:\Apache2.2\conf> \Apache2.2\bin\openssl rsa -in privkey.pem -out server.key
Enter pass phrase for privkey.pem:前に入力したパスワード
writing RSA key
**%%server.crt(デジタル証明書)%%**の作成
C:\Apache2.2\conf> \Apache2.2\bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365
Loading 'screen' into random state - done
Signature ok
subject=/C=JP/ST=Tokyo/L=Tokyo/O=Example Inc./OU=Baz Section/CN=www.example.com/emailAddress=master@example.com
Getting Private key
デジタル証明書を作成する際、使われたオプションの意味を次に示す。
^オプション^種類^意味^
|x509|サブコマンド|X.509形式のデジタル証明書の作成します。|
|-in|オプション|CSRファイルパスを指定します。|
|-days 日数|オプション|証明書の有効期限を指定します。|
|-req|オプション|入力ファイルが CSRファイルであることを指定します。|
|-signkey|オプション|自己証明書生成時に使用するオプション。秘密鍵のパスを指定します。|
===== httpd-ssl.conf 修正 =====
続いてSSL設定ファイル(conf/extra/httpd-ssl.conf)を修正する。\\
修正する部分を次に示す。
^修正前^修正後^
|%%%%|%%%%|
|%%SSLCertificateFile%% デフォルトのデジタル証明書パス|%%SSLCertificateFile%% 皆さんが生成したデジタル証明書パス|
|%%SSLCertificateKeyFile%% デフォルトの秘密鍵パス|%%SSLCertificateKeyFile%%皆さんが生成した秘密鍵のパス|
設定例を次に示す。 ここで、証明書のサーバー名(Common Name)が違うとApacheサーバーのエラーログにエラーが記録される。\\
正しい証明書をセットするように注意したい。
NameVirtualHost 172.20.30.40:443
ServerName www.pne-test.com
DocumentRoot C:/Apache2.2/htdocs
ErrorLog "C:/Apache2.2/logs/error.log"
TransferLog "C:/Apache2.2/logs/access.log"
SSLCertificateFile "C:/Apache2.2/conf/server.crt"
SSLCertificateKeyFile "C:/Apache2.2/conf/server.key"
===== manual test for Https connection =====
$ openssl s_client -connect localhost:443 -state -debug
GET / HTTP/1.0
===== reference =====
- [[http://www.thinkit.co.jp/free/article/0706/3/6/|SSLの基本を押さえる]]
- [[http://www.gadgety.net/shin/tips/win/apache2.html|WindowsにApache2 SSLをインストール]]
- [[http://jp.php.net/manual/ja/openssl.installation.php|OpenSSLのインストール手順]]
- [[http://www.thinkit.co.jp/free/article/0706/3/7/|Apache+SSL環境を構築しよう]]
~~DISCUSSION~~