Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-14.log failed

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 Name2文字の国コードを入力
State or Province Name州、県の名前を入力(CAのように省略しない)
Locality Name市の名前を入力
Organization Name組織の名称を入力(特殊な文字はなるべく避ける &→and)
Organizational Unit Nameセクション名を入力
Common Nameサーバーの別名ではなく、セキュアサーバーの本当の名前(有効なDNS名)を入力
Email AddressWebマスターやシステム管理者の電子メールアドレスを入力

設定例を次に示す。

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

reference

コメント

fresg, 2011/03/28 00:59

www.charmforbracelets.com

コメントを入力. Wiki文法が有効です:
P G J Z C
 

QR Code
QR Code study:php5:ssl (generated for current page)