之前都是在 UNIX-like 的系統下架設 apache 網頁伺服器,而且不論是 Linux 的套件管理系統,抑或是 FreeBSD 的 ports 都把安裝的程序作好了,所以比較少碰到裝不起來的問題。但來到 Windows 下來作這件事就頭大了!雖然不必辛苦地把相關的程式碼抓回來編譯,但還是要自己搞定一些相關的設定就是了,以下是我最近在 Windows 系統(目前是在 Windows XP)上安裝 apache + PHP + mod_ssl 的經驗記錄。

前置作業 – 需要下載的檔案

這裡我列出我完成這件事情所抓下來的檔案:

  1. apache_2.0.59-win32-x86-no_ssl.msi
  2. Apache_2.0.59-Openssl_0.9.8b-Win32.zip
  3. php-5.1.4-Win32.zip
  4. Openssl-0.9.8b-Win32.zip
  5. openssl.cnf

上述檔案我都附上可以去哪個網頁上找到,同時也將它們編號,這樣之後的說明都用編號表示用到哪個檔案。

安裝相關檔案

首先,直接安裝 1 ,用官方的這份安裝檔案的話,可以用 monitor 跟幫你裝成 Windows 服務,這樣就能設定開機時自動啟動 web 伺服器了。安裝時會要你填入相關的訊息,同時也留意一下你把 apache 裝在哪個目錄下(比方說 D:\Apache

然後解開 3 ,也注意你把它解壓縮到何處(比方說 D:\PHP ),解壓縮後,到 apache 的安裝目錄下的 conf 資料夾裡,修改 httpd.conf 這個檔案,然後在最後面加上下面這段:


# For PHP 5 do something like this:
LoadModule php5_module "d:/php/php5apache2.dll"
AddType application/x-httpd-php .php
# configure the path to php.ini
PHPIniDir "d:/php"

修改完之後,如果你的 apache 服務已經啟動(可以看右下角的工具列圖示),請先將它 stop,然後找個地方解開 2 ,我們需要把解開後的 bin 目錄下的 Apache.exe、 ssleay32.dll 及 libeay32.dll 放到你 apache 安裝目錄下的 bin 目錄裡,替換掉原本的 apache.exe。然後再將 2 解開後的 conf 目錄下的 ssl.conf 也複製一份到你自己 apache 目錄(如 D:\Apache)下的 conf 目錄裡,還有 modules 目錄下的 mod_ssl.so 也要放到 apache 目錄下的 modules 目錄裡。

接著將 ssl.conf 裡找到下列這段敘述,然後把它改成你的設定:(用文字編輯器打開)


# General setup for the virtual host
DocumentRoot "你的網頁根目錄 可以找 httpd.conf 下的 DocumentRoot"
ServerName 你的 domain name:443
ServerAdmin 你的 email
ErrorLog logs/error_log
TransferLog logs/access_log

接下來我們要產生 SSL連線(HTTPS)時所需要加密的 key 及身份驗證用的 CA。首先,找個地方解開 4 ,比方說 D:\OpenSSL ,接著再把 5 放到該目錄下,並且找到下列地方將它修改成:


dir = ssl
certs = $dir\\certs
crl_dir = $dir\\crl
database = $dir\\index.txt
new_certs_dir = $dir
certificate = $dir\\cacert.pem
serial = $dir\\serial
crl = $dir\\crl.pem
private_key = $dir\\privkey.pem
RANDFILE = $dir\\privkey.rnd

還有別忘了把這個檔案裡的 x509extensions 這一行在開頭加上 # 把它註解掉。然後在 D:\OpenSSL 目錄下建立一個 ssl 資料夾,在裡面新增兩個檔案:index.txt 及 serial,index.txt 讓它保留空白即可,然後 serial 檔案裡打入 01


然後在命令列模式下(「開始」->「執行」打 cmd,然後用 cd 指令切到 D:\OpenSSL)依序輸入下列指令:

  1. 產生 CA private key,它會要求你輸入密碼
    openssl genrsa -des3 -out ssl/ca.key 1024
  2. 產生 CA require cert,照著它的說明填入對應資料
    openssl req -config openssl.cnf -new -key ssl/ca.key -out ssl/ca.csr
  3. 產生 CA public cert
    openssl x509 -days 3650 -req -signkey ssl/ca.key -in ssl/ca.csr -out ssl/ca.crt
  4. 產生 Server private key
    openSSL genrsa -out ssl/server.key 1024
  5. 產生 Server require cert,這裡跟上面填入相同的資料
    openssl req -config openssl.cnf -new -key ssl/server.key -out ssl/server.csr
  6. 產生 Server public key
    openssl ca -config openssl.cnf -days 3650 -cert ssl/ca.crt -keyfile ssl/ca.key -in ssl/server.csr -out ssl/server.crt

如果沒有錯誤訊息的話,那在你的 D:\OpenSSL\ssl 資料夾下應該至少會有 ca.crt、server.crt 及 server.key 這三個檔案(確定它們不是 0 byte)。然後把 ca.crt 及 server.crt 放到 D:\Apache\conf\ssl.crt\ 目錄下,而 server.key 放到 D:\Apache\conf\ssl.key\ 目錄下。接著就檢視一下 D:\Apache\conf\ssl.conf 檔案裡是不是有這幾行:


SSLCertificateFile conf/ssl.crt/server.crt
SSLCertificateKeyFile conf/ssl.key/server.key
SSLCertificateChainFile conf/ssl.crt/ca.crt

然後我自己是有把 ssl.conf 裡的 <ifdefine SSL> 及 </ifdefine> 註解掉,這就要看你要不要再去 httpd.conf 裡 define SSL 囉。

如果你很順利作到這裡,那就可以重新啟動 apache 的服務,然後試試看能不能用 https 連接到你的網頁伺服器吧!

本文參考:【懶人教學】建構您的 Apache + SSL on Win32The Apache + SSL on Win32 HOWTO

 

歷史上的今天