====== 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~~