作為全球最大最有影響力的搜尋器 – Google,它的一舉一動都關乎網站的人流,而 Google 自從更改演算法,支援 SSL 的網站會有較佳排名,各站長就不得不留意了。

SSL 的誤會

  1. 有不少人認為 SSL 很貴,但其實暫時企企見到最平的 SSL 已經低至 US$3.5 一年(不過需要一次過交 5 年費用),而逐年繳交的貴一些,但也只需要 $3.88 一年,和一個 domain 價錢差不多。
  2. 而有些人認為 SSL 會拖慢網站速度,但其實現在兩者已經相差不大,而且已經有 spdy 等新 protool,需要 SSL 才能支援。
  3. 還有一些人以為使用 SSL 後用戶端就不會有緩存,但其實會否緩存是由 cache-control header 控制,而 http 和 https 只是傳送方式的分別,並不影響緩存。
  4. 有些朋友以為 SSL CERTIFICATE 一定要獨立 IP 才可以申請,其實並不需要,一般 web hosting 都可以申請。
COMODO SSL 90 day apply page
90 日免費 SSL 試玩

安裝 openssl

首先用戶需要準備一條 private key,如果在 ubuntu,只要安裝 sudo apt-get openssl 安裝就可以了。
windows 用戶在這裏下載 win32/64 版本的 openssl – http://indy.fulgan.com/SSL/

製作 private key

輸入 “openssl genrsa -out example.com.key 2048
制作 key 後再制作 csr
openssl req -new -key example.com.key -out example.com.csr
填入有關資料,而最重要的是 Common Name (eg, YOUR name) []:
需要填寫你網站的資料,就本站來說,就是 enterpr1se.info,一般 CA 都會連 www 的網址給你,即是可以在 enterpr1se.info 和 enterpr1se.info 上用。

enterpr1se.info csr making

申請 SSL cert

今次使用了免費 90 days 的 COMODO SSL cert 來示範,首先到 https://secure.instantssl.com/products/SSLIdASignup1a signup 和填寫 private key 的資料。
如果在 linux 上可以用指令 cat example.com.key 來看,在 Windows 上面用 notepad 就可以了。
而 private key 的內容格式類似這樣,將全部內容抄在網頁上

—–BEGIN CERTIFICATE REQUEST—–
MIIDUDCCArkCAQAwdTEWMBQGA1UEAxMNdGVzdC50ZXN0LmNvbTESMBAGA1UECxMJ
TWFya2V0aW5nMREwDwYDVQQKEwhUZXN0IE9yZzESMBAGA1UEBxMJVGVzdCBDaXR5
(more encoded data)…….
Rq+blLr5X5iQdzyF1pLqP1Mck5Ve1eCz0R9/OekGSRno7ow4TVyxAF6J6ozDaw7e
GisfZw40VLT0/6IGvK2jX0i+t58RFQ8WYTOcTRlPnkG8B/uV
—–END CERTIFICATE REQUEST—–

COMODO 會 send email 給用戶以確認 domain,只要依指示認証就可以了。

制作 .crt cert

COMODO 會寄 email 給入面,入面應該有4 個檔案,如下圖:

enterpr1se.info cert zip

解壓後,在 linux 可以輸入以下指令 (enterpr1se_info.crt 請自行更改)

cat enterpr1se_info.crt ComodoHigh-AssuranceSecureServerCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt

完成後會有一個叫 ssl-budle.crt 的檔案。
在 Winodws 上面則只要用 notepad 將上述四個檔案的內容抄進一個檔案上就好了。

設定 nginx

在 /etc/nginx/site-available 內,vim 你網站的設定檔。
將內容改成 (example.com 改為用戶自己的網址)

server {
listen 443;
server_name example.com;
ssl on;
ssl_certificate /var/www/example.com/cert/ssl-bundle.crt;
ssl_certificate_key /var/www/example.com/cert/example.com.key;
#... other stuff
}

如果 nginx 支援 spdy 的話可以改為
listen 443 ssl spdy;

再將 port 80 HTTP 的內容自動 redirect 去 HTTPS SSL,在檔案最後加上

server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}

另外在 nginx 設定開啓 SSL session cache 加速 SSL
在 http 內容加上

http {
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
#... other stuff
}

最後 restart nginx sudo service nginx restart

設定 Apache

在 ubuntu 內,一般安裝 apache 都已經安裝了 mod_ssl
如果真的沒有的話可以這樣安裝

sudo apt-get install apache2-common

其他 linux 可以這樣安裝

yum install mod_ssl

安裝後有機會需要啓用 SSL 模組 (optional)

sudo a2enmod ssl

之後設定 apache,一般來說 apache SSL 的設定位置多數名稱是

  • httpd-ssl.conf
  • ssl.conf
  • /etc/apache2/sites-enabled/ folder 內.

在 virstual host 下,Apache 預設網站名稱是 default-ssl.conf,其他 virtual host 名稱多數和 domain name 相同,如 enterpr1se.info.conf 或者 enterpr1se_info.conf 等。
下面以 example.com.conf 為例子,其他 virtual host 都是大同小異。

<VirtualHost www.example.com:443>
     SSLEngine On
     SSLCertificateFile /etc/apache2/ssl/example.com.crt
     SSLCertificateKeyFile /etc/apache2/ssl/example.com.key
     SSLCertificateChainFile /etc/ssl/ssl.crt/ssl-bundle.crt

     ServerAdmin [email protected]
     ServerName www.example.com
     DocumentRoot /var/www/example.com/public_html/
     ErrorLog /var/www/example.com/logs/error.log
     CustomLog /var/www/example.com/logs/access.log combined
</VirtualHost>

最後只要 restart apache 就可以 sudo service apache2 restart

將所有連線都以 https 進行

如果想將所有 http 連線都轉為 https
只要在根目錄 (root) 上的 .htaccess 加上

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]