【網站開發】為網站加入SSL憑證,使其可以HTTPS瀏覽

  前面幾篇我曾說明如何將Bitnami包裝好的Wordpress套件佈署於Google Cloud Platform上,並申請一個固定域名供外界瀏覽。這一篇我將說明如何為網站加入SSL憑證,使其能以HTTPS瀏覽。近年來,更具安全性的https加密傳輸已經越來越被受到重視,2014年Google更宣佈Chrome將預設以https瀏覽為優先,https將會成為Google搜尋引擎排序的關鍵因素。

  在Azure的時候,如果Web APP的域名為*.azurewebsites.net結尾,將自動支援https瀏覽,真是佛心來著。但是到了Google Cloud Platform的時候,GCP雖然支援https流量,https瀏覽卻要自己想辦法。這下讓我體會到GCP雖然各項設施比Azure便宜,還是有劣於Azure的不便之處。而前篇我曾說過,我購買的固定域名是NameSilo,但我買了域名後才發現NameSilo不提供SSL憑證,Namecheap有提供加購SSL憑證,害我都想跳槽到比較貴的Namecheap了。

一、在虛擬機上利用OpenSSL建立SSL憑證(Bitnami)

https://docs.bitnami.com/google/components/apache/#how-to-create-an-ssl-certificate

  在虛擬機上建立SSL憑證的方法。bitnami網站上已有非常詳盡的文件可供參考,實讓我事半功倍。由於Bitnami在安裝Wordpress的時候都已順道安裝好OpenSSL,以下指令碼是內建在安裝好OpenSSL下方可執行。

  首先,必須先產生一個伺服器的私鑰(private key):

sudo openssl genrsa -out /opt/bitnami/apache2/conf/server.key 2048

  再來產生一項憑證(cert.csr)。在產生憑證途中,系統會要求填入一些基本資料,所謂Common Name便是域名。

sudo openssl req -new -key /opt/bitnami/apache2/conf/server.key -out /opt/bitnami/apache2/conf/cert.csr

  把憑證拿去給公信力單位簽署,便可下載一個新的憑證回來。當然,這個憑證也可以由自己來簽署,但自己簽署就不具備公信力了。以下是憑證由自己簽署的方式,有效日為一年。

sudo openssl x509 -in /opt/bitnami/apache2/conf/cert.csr -out /opt/bitnami/apache2/conf/server.crt -req -signkey /opt/bitnami/apache2/conf/server.key -days 365

  下面兩個步驟應該不是必須,只是把伺服器私鑰備份一下。老實說我也不太清楚下面兩個步驟的用意是什麼。

sudo openssl rsa -des3 -in /opt/bitnami/apache2/conf/server.key -out privkey.pem

sudo openssl rsa -in privkey.pem -out /opt/bitnami/apache2/conf/server.key

  理論上把憑證簽署好放回伺服器上,一切就OK了,應該是這樣沒錯吧?但我按照以上方法後,瀏覽器依然不認憑證,所以我也不清楚這個作法對不對。因為我後來的方法是直接利用cloudflake從中將傳輸自動加密,也就不需要在虛擬機安裝憑證了。

二、為SSL憑證簽署-SSL for Free + Let’s Encrypt

  簽署憑證是建立https加密傳輸最重要的一環,沒有公信力單位簽署則瀏覽器不認憑證,而在免費簽署領域中,Let’s Encrypt是最有名的簽署單位。然而,由於用Let’s Encrypt來簽署憑證的方式有點複雜,需要用到一堆指令碼,所以還有另一種服務名為SSL for Free,以第三方軟體來呼叫Let’s Encrypt的功能。

https://www.sslforfree.com/

  在SSL For Free首頁最醒目的網址列輸入網址後,按Create Free SSL Certificate即可進入下一步驟,接下來會看到三個醒目的按鈕。

  這裡必須按兩個按鈕:先按最上面的Manual Verification開啟分頁後,再按Retry Manual Verification。其實看得懂英文的話,看網頁上的指示就知道怎麼做了,根本不需要我寫得這麼細。點選Download File #1下載加密檔案至本機,在網站伺服器的根目錄新增一個目錄名為.well-known,裡面再新增一個目錄名為acme-challenge。以Bitnami建立的虛擬機內的檔案路徑為例,這個目錄必須建立在這個位置:

/opt/bitnami/apps/wordpress/htdocs/.well-known/acme-challenge

  再把剛才下載的加密檔上傳到這個目錄下。從瀏覽器去確認這個加密檔是否能正常瀏覽。確認一切正常後,點選最後的按鈕Download SSL Certificate

  到這裡為止,先前我一直是失敗的,因為我點了Download SSL Certificate後一直跳到錯誤訊息畫面,無論換哪一台電腦都一樣,找了資料還是不清楚發生什麼事。那時可能是SSL For Free的服務掛了,所以一直失敗,讓我惱火不已,所以才放棄SSL For Free轉而尋找其他方法。不過在我撰寫這篇文章,重新操作一遍SSL For Free時,這次點擊Download SSL Certificate竟然成功了,讓我下巴都掉下來了。

  SSL For Free成功生成金鑰後,提供Certificate、Private Key和CA Bundle三種檔案下載。由於這個憑證三個月就會過期,SSL For Free還提供憑證過期前自動通知的服務。按照Bitnami建立的虛擬機內的檔案路徑,伺服器私鑰與憑證檔案必須要放在以下路徑:

Private Key /opt/bitnami/apache2/conf/server.key
Certificate /opt/bitnami/apache2/conf/server.crt
CA Bundle /opt/bitnami/apache2/conf/server-ca.crt

  如果檔名有改,需到/opt/bitnami/apache2/conf/bitnami/bitnami.conf確認路徑是否正確。以上即為透過SSL For Free建立憑證的過程,看起來挺簡單的,但我當時可沒這麼幸運,正因當時使用SSL For Free一直失敗,才迫使我尋找下一個方法。

三、為SSL憑證簽署-Comodo Free SSL

  免費自然有「免費沒好貨」的說法,所以前一個方法在當時行不通後,我便開始考量付費方案。提供付費憑證的廠商相當多家,除了域名商外,像防毒軟體賽門鐵克也是簽署憑證的公信機構之一,但最有名的還是Comodo。付費憑證最便宜平均一年大概也要10塊錢美金左右,不過也有CheapSSL網站上提供Comodo SSL一年4.99美金,相當便宜,只是雖然經濟上還算可接受,還是不敢隨便就買下去,所以我先試用了一下Comodo官網提供的90天免費SSL試用。

https://ssl.comodo.com/free-ssl-certificate.php

  Comodo Free SSL的申請過程還真不是普通的煩人。首先,必須先將伺服器產生的未簽署憑證貼在上面,填寫一些基本資料,還必須用個有效信箱來確認域名是否有效。聽起來挺合理的,但就是在以信箱確認有效性這一步讓我卡了很久。前篇文章我提過,NameSilo域名提供Whois資訊加密的功能,所以我當然也順手把我的域名Whois資訊加密了。但Comodo在確認域名有效性時,會自動抓取Whois內的註冊者E-Mail信箱作為確認信箱,這個信箱之後想改都不能改。為了讓我的信箱能收到信,我只得到NameSilo管理介面去設定信箱,讓寄到NameSilo域名信箱的信可以自動轉到我的信箱。我在想,還好NameSilo有提供信箱功能,要是其他域名商沒提供信箱的話要怎麼辦。又因所有域名設定都需要等一陣子才會完全生效,我真的是等了很久才總算在我的信箱收到Comodo寄來的確認信。

  域名確認完成後還不算正式結束,因為送交申請案後接下來便是人工審核,還好審核時長等個幾小時就申請通過了,於是從管理介面可以下載到以下幾個檔案。

  看起來我再把憑證上傳到我的伺服器就好了,是吧?可是當我把憑證上傳到伺服器後,系統卻一直跟我說和私鑰不合。不管我換以上哪個檔案與確認設定檔路徑都沒用,我才突然想起,難道我在產生憑證時所輸入的域名有錯?也就是我要安裝憑證的伺服器域名為re5tof.amoryportal.com但我卻寫amoryportal.com?無論如何,Comodo似乎同一個主域名只要申請過就不能再重複申請,我重複填寫申請單就是一直被導入到舊的憑證上去。我費了好一長串申請流程,到最後依然無法把憑證安裝成功。也許有太多流程與原理我還是不夠了解,但惱火的我在花費太多時間後,決心尋找下一個方法。

四、為SSL憑證簽署-Cloudflare

  Cloudflare是非常有名的網站託管平台,提供各種非常強大的功能諸如加密、壓縮、快取、24小時不斷線、節省流量和分析等等,我雖然先前就常耳聞,但一直沒有仔細去研究過,一用才知真的是非常強大,前面幾個整人的SSL服務根本都相形失色。

  Cloudflare使用方式很簡單,登入好帳號後把域名輸入進去讓它掃描即可。

  值得注意的是,必須要將Cloudflare的Nameserver登錄到域名的管理介面中,然後域名的管理介面中只能保有Cloudflare的Nameserver,其他NameServer都要刪除。因為之後DNS都會統一由Cloudflare託管,所以設定全都放在Cloudflare管理介面上就可以了。如上圖所示,NameSilo的Nameserver管理介面只要寫上Cloudflare的Nameserver就夠了,雖說NameSilo管理介面上會出現警告訊息(如果沒使用Cloudflare的話,NameSilo要求必須登錄自己的Nameserver,所有設定才會生效),但不要管它。

  網站託管完成後,Cloudflare管理介面大概是長這個樣子。上方選單有很多功能,可以自行隨意探索,我這裡就先來說明SSL的部份。SSL的設定是在Crypto頁面中,其實只要把SSL選項啟用,網站就支援https加密傳輸了。

  Cloudflare的SSL分為三種,而Cloudflare所扮演的角色就如同上圖所示。Cloudflare是個位於伺服端與使用者之間的中繼平台,使用者平常接觸的都是Cloudflare資料中心託管的資料,而非直接接觸到伺服端,如此一來將能大幅降低伺服端的負擔,提昇安全性。為避免更為繁瑣的設定,我覺得Flexible SSL對於常人來說就足夠了。所有使用者到Cloudflare託管的資料這段是加密的,但Cloudflare到伺服端這段並未加密。

  Cloudflare也有提供給伺服端安裝的憑證下載,位居Crypto頁面的Origin Certificates之中,一次簽署有效期為15年,實在佛心,前面那什麼只簽一年或三個月的憑證根本都不夠看。不過,駑鈍的我將這個憑證安裝到伺服器時卻一直沒有成功,反而是前面SSL的懶人選項一啟用就可以https瀏覽,所以這邊憑證有沒有安裝成功我也就不在意了。

  當所有SSL設定都完成後,打開網站的https網址。如果網頁本身包含一些http的連結,瀏覽器還是會發出不安全警訊,這時就要手動將所有網頁內引用的物件連結改為https,當所有連結皆為https時,瀏覽器網址便會出現完美的綠色鎖頭符號了。

  PERFECT!漫長的旅程總算結束了。