目次
Apache2 + PHP5 SSL Installation
Windows環境下でSSLを設定するステップを紹介する。
Prerequisite
SSLの環境を構築する為には次がセットアップされている必要がある。
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 []:<Enter>
ここで、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)を修正する。
修正する部分を次に示す。
修正前 | 修正後 |
---|---|
<VirtualHost _default_:443> | <VirtualHostサーバのIPアドレス:443> |
SSLCertificateFile デフォルトのデジタル証明書パス | SSLCertificateFile 皆さんが生成したデジタル証明書パス |
SSLCertificateKeyFile デフォルトの秘密鍵パス | SSLCertificateKeyFile皆さんが生成した秘密鍵のパス |
設定例を次に示す。 ここで、証明書のサーバー名(Common Name)が違うとApacheサーバーのエラーログにエラーが記録される。
正しい証明書をセットするように注意したい。
NameVirtualHost 172.20.30.40:443 <VirtualHost 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" </VirtualHost>
manual test for Https connection
$ openssl s_client -connect localhost:443 -state -debug GET / HTTP/1.0
コメント
www.charmforbracelets.com