來源:https://www.williamyao.com/index.php/archives/1397/
前言
最近收到 StartCom 的郵件,數字證書即將過期,想到去年在 StartSSL 上折騰數字證書的一番啰嗦經歷心里就打怵,可是又沒辦法,只好懷着“悲痛”的心情登上 StartSSL,結果……!原來惡心人的界面統統消失了,取而代之的是全站的大更新,就連原來非常繁瑣的 Certification 和 Validation 流程也被非常高效的向導給取代了!整個界面以側邊欄總覽的方式將帳號下所有的內容全部概括,看着就讓人“賞心悅目”!
經過一段時間的摸索和測試,雖然全新的 StartSSL 利用向導和無處不在的“提示”大大簡化了用戶的使用門檻,但還是有一些地方需要注意的,遂作此文,從新用戶注冊環節開始,經由域名認證、SSL 證書認證等步驟直到配置 Nginx 虛擬主機以支持 SSL 加密通信,為網站掛上“自信”的HTTPS標簽,全程記錄每一步分享給大家。
此文閱讀難度:純新手可讀(既然到了 SSL 級別,應該也不會太“新”吧~)
廢話不多說,讓我們開始!
<!--more-->
StartSSL 方面
首先介紹在 StartSSL 方面的操作,因為這才是真正獲得證書認證的關鍵流程。
注意:因為此文操作全程在 Win10 平台進行,所以在證書申請的全過程中,推薦使用 IE 瀏覽器(方便證書的導入導出),如果使用其他瀏覽器,遇到的任何問題將超出本文討論范圍。
注冊登錄
已經注冊過會員的童鞋請跳過此步驟。
首先需要說明一點,StartSSL 繼續沿用了以往的登錄方式:證書登錄!
這也是很多童鞋在過去興致勃勃的沖到 StartSSL 想要申請一個屬於自己的數字證書時,被那個非常不友好的 StartSSL 界面卡在了新用戶注冊這第一個環節……
所以,在 StartSSL 上的全部操作,用的都是一張 Email 證書,不需要用戶名密碼什么的。
首先訪問 StartSSL.com 點擊 Sign-up 進行注冊

這里最好填寫能夠正常收到郵件的郵箱,並且最好是常用郵箱,因為以后在 StartSSL 上的所有操作,都會與此郵箱關聯。
接下來的步驟比較簡單,在到讓我們選擇怎樣生成證書的時候,選擇直接導入到 IE 中就可以。
經過一番郵箱驗證之后,我們就得到了由 StartSSL 頒發的郵箱證書,在“Internet 選項、內容、證書”里面可以選擇導出這個證書,妥善保存,日后登錄 StartSSL 就全靠這個證書了,有效期一年,過期后需要重新驗證。

之后就登錄進 StartSSL 中,默認停留在控制面板頁面,右側側邊欄中會顯示所有該證書用戶名下的所有認證信息,當然如果是新用戶,應該除了個人信息外空空如也,沒關系,我們繼續。
驗證域名
在這一步之前,我相信在注冊環節中,你已經將個人信息什么的填寫完整了。
想要獲得某域名的證書之前,首先要驗證該域名的所有權。

選擇上面的Validations Wizard,啟動驗證向導,在下面選擇Domain Validation對域名進行驗證,點擊繼續,來到下一步

輸入想要驗證的域名,注意這里我用的是頂級域名,至於二級以上域名是什么情況,我沒進行驗證,不過看此文的童鞋,應該都有頂級域名吧:)
填入想要驗證並獲得證書的域名后,StartSSL 系統會自動對該域名進行whois查詢,找到域名所有者的電子郵件地址,並讓你選擇將驗證郵件發到哪個郵箱,只能選擇查詢到的域名所有者郵箱或者列出的其他三個常用形式的管理員郵箱,其他郵箱是無法進行驗證的。

這里還會遇到個問題,如果你的域名服務商為你開啟了隱私保護,那么這里的域名所有者郵件地址一般情況不會查詢到真正可操作的郵箱,比如阿里雲的域名隱私保護如果開啟了,列表中第一個郵箱會是以阿里雲結尾的一個偽裝郵箱,經測試,這個郵箱是無法收到任何郵件的(本以為會代為轉發),所以在進行這一步之前,一定要暫時關閉隱私保護。
如果你的郵箱服務器比較穩定,會立刻收到驗證郵件,按照郵件里的說明將驗證碼輸入進頁面里點擊驗證,域名就驗證成功了。
申請證書
先多啰嗦一句,StartSSL 上的驗證、申請流程幾乎都是自動的(除了證書廢止等操作需要人工審核),所以沿着本文的文絡前進的同時,你已經在逐漸擁有各種東西了~
開始,重新回到控制面板,選擇上面的Certificates Wizard啟動證書申請向導,默認選擇第一項Web Server SSL/TLS Certificate並下一步。

接着,我們會來到一個滿屏“鳥語”有點讓人頭大的頁面,其實這個頁面的內容也非常簡單,我們一步一步來。

首先,在上面的文本框中輸入想要獲得證書的域名,這里要注意以下幾點:
-
每一行輸入一個域名
-
第一行的域名為主域名(然並卵……其實很少有人會點擊 HTTPS 旁邊的“鎖”去認真查看證書內容的)
-
只能輸入五行(五個域名)
-
你這里輸入的域名,在最后只會得到一個
bundle,也就是單一證書捆綁多個域名,為你在上面輸入的所有域名提供驗證。
這里特別要注意,如果真的輸入了五個域名(包括二級以上域名),生成了一個證書,其實在后期是比較難管理的,如果你名下有好幾個域名,稍加時日,完全搞混亂幾乎是必然的,所以我的建議是:不要采用我在上面圖片中一次填滿五個的方式,而是每次只驗證一個(頂級或者二級)域名,這樣每個域名都會得到一個獨立的證書,給證書以及配套的文件單獨建一個以域名為名稱的文件夾保存,一目了然,不會搞混。
另外,如果你已經捆綁了好幾個域名到一個證書上,我的做法是:不用這個證書就好~~重新為每個域名申請獨立的證書,因為每個域名是可以多次申請多個證書的,不礙事兒。
填寫好域名,我們開始關注頁面的下半部分,這一部分是需要我們提交認證簽名請求(CSR),我們選擇第一項Generated by Myself,使用工具自己生成簽名文件及對應密鑰。
這里注意看提示,StartCom 很貼心的提供了一個 Windows 平台上使用的綠色工具,一鍵完成簽名文件及對應密鑰的生成工作。當然,如果在其他平台,或者喜歡用openssl,也可以根據提示的命令進行生成:
openssl req -newkey rsa:2048 -keyout yourname.key -out yourname.csr
如果機器性能夠強(服務器),也可以使用rsa:4096,更高算位提供更高安全性,不過性能會受到影響,記住我們生成的證書是要給服務器用的,你需要在負荷及安全性上做權衡了。
那么怎么生成 CSR 呢?這里演示一下 StartCom 的小小綠色工具的用法,首先在這個頁面中點擊StartComTool.exe下載到本地,運行該程序:

如果文本框里已經有內容了,就點一下Clear
直接點擊下方綠色的Generate CSR按鈕,在彈出的對話框中選擇路徑,保存相關文件(比如給文件起名叫 app.williamyao.com.key),這一步工具會自動為我們生成兩個名稱相同的文件,一個是 CSR,一個是 Key,這兩個文件都要保存好,一個是簽名內容(PEM 格式),一個是密鑰文件,密鑰文件在下一步配置 Nginx 時會用到。
然后,將文本框中的 CSR 內容復制粘貼到瀏覽器的文本框中(直接點“Copy”按鈕,回到瀏覽器粘貼即可),現在我們的頁面看起來是這個樣子:

之后,我們點擊Submit提交申請。
不出意外的話,我們的證書文件立刻就生成好了:

這里注意,我們不能用下載工具進行下載(因為 StartCom 的證書認證機制),請點擊右鍵選擇“目標另存為”使用 IE 的方式進行下載。
下載回來的是一個壓縮包,解開看一看,原來 StartSSL 很貼心的為我們生成了一套對應各個常用服務器的證書文件,我們這里把 Nginx 的對應證書文件單獨解壓出來,得到一個.crt文件,先放好這個文件,一會兒會用到。
在進入下一步之前,我建議大家重新整理一下上面的流程中得到的所有文件,以我為例:
-
新建文件夾 startssl-signed
-
進入文件夾,新建文件夾 app.williamyao.com
-
將對應文件拷貝到 app.williamyao.com 文件夾中
經過整理,文件夾中會有如下文件:
-
lnyk@me.com-2017.pfx(從 IE 中導出的用於登錄 StartSSL 的電子郵件證書)
-
app.williamyao.com.csr(簽名文件)
-
app.williamyao.com.key(密鑰文件)
-
app.williamyao.com.zip(下載下來的證書文件壓縮包)
-
INTRO(文本文件,里面記錄一下上面三個文件的生成日期,以及證書文件的到期日期等等)
這樣整理之后,以后為其他域名申請的證書也可以這樣存放,就不會亂套了。
這里再建議大家一遍,如果手里域名多的話,最好給每個域名單獨申請證書(就是只填寫一行域名到向導的文本框中),“大合集”的方式,實在不利於日后為其他域名增添 SSL 支持,以及統一管理。
整理完文件了?是不是看着賞心悅目的?好,我們進行下一步,配置 Nginx,讓證書真正發揮用處!
Nginx 方面
在進行配置之前稍作一個假設,Nginx 以虛擬主機方式保存配置文件,即每個虛擬主機有自己單獨的.conf文件,這種方式比把所有東西都丟進nginx.conf里面強得多,而且現代版本的 Nginx 都是默認采用虛擬主機方式進行配置了。
至於為什么做這樣的鋪墊,是為了下面解決容易碰到的一個問題,我們到達那個步驟的時候再詳細說明。
上傳文件
我們需要將兩套文件上傳到服務器,每一套中有兩個文件,一個是 CRT 證書文件,一個是 KEY 密鑰文件,用於啟用www.williamyao.com以及app.williamyao.com這兩個域名對應虛擬主機的 SSL 支持,
這里將每套兩個文件做如下命名:
-
www.williamyao.com.crt
-
www.williamyao.com.key
-
app.williamyao.com.crt
-
app.williamyao.com.key
然后傳到服務器上,我的建議是將上面的文件統一放在下面的路徑中(這個路徑也是 *nix 平台規范建議的 SSL 證書存放路徑,便於管理,既然有“先人指路”,我們不妨照做:
# /etc/ssl/private/
值得注意的是,將文件放在這個文件夾中,需要用到 root 權限,即sudo cp,放進去后的文件所屬用戶保持root:root就好,Nginx 的執行進程是可以讀取的。
配置 Nginx
先別急,這里說明一下,啟用 SSL 的一般做法是,虛擬主機的主server段不監聽 80 端口,而是直接監聽 443 端口,然后在主server配置段后新開一個server段監聽相同server_name的 80 端口,並將請求 301 重定向到 HTTPS.
這樣做的好處是,不管訪問者是否制定 HTTPS 協議(一般人上網大都只會輸入域名,不會先寫協議的吧……),只要輸入域名,Nginx 接到請求后就會將請求重定向到 443 端口的 SSL 主機上。
下面我們也打算這么做,以我為例:
SSH 到服務器上,分別編輯兩個虛擬主機的 conf 配置文件,我們先來第一個:
sudo nano /usr/local/nginx/conf/vhost/www.williamyao.com.conf
將配置信息添加到配置文件中,配置好的www.williamyao.com.conf文件形如這個樣子:
server{listen 443 ssl;# 下面這一行用於啟用 IPv6 支持listen [::]:443 ssl ipv6only=on;server_name www.williamyao.com;# SSL 支持配置如下ssl on;ssl_certificate /etc/ssl/private/www.williamyao.com.crt;ssl_certificate_key /etc/ssl/private/www.williamyao.com.key;...(其他配置)...}server{listen 80;listen [::]:80 ipv6only=on;server_name www.williamyao.com;return 301 https://www.williamyao.com$request_uri;}
之后編輯另一個虛擬主機app.williamyao.com.conf配置文件,形如下面這樣:
server{listen 443 ssl;# 下面這一行用於啟用 IPv6 支持listen [::]:443 ssl;server_name app.williamyao.com;# SSL 支持配置如下ssl on;ssl_certificate /etc/ssl/private/app.williamyao.com.crt;ssl_certificate_key /etc/ssl/private/app.williamyao.com.key;...(其他配置)...}server{listen 80;listen [::]:80;server_name app.williamyao.com;return 301 https://app.williamyao.com$request_uri;}
細心的童鞋以及高手可能已經發現了,這兩個虛擬主機的配置稍有不同,這也是我們之前做那個小小的鋪墊的用意。注意觀察WWW主機的ipv6only=on開關,在APP主機中是沒有的,因為按照 Nginx 關於ipv6only這個開關的設置,在全部虛擬主機中,只能有唯一一台主機監聽的某端口帶有此開關,在我們的例子中,如果APP主機也啟用這個開關,Nginx 進程會報“重復監聽端口”的錯誤並強制退出。至於ipv6only的詳細內容,請自行百度:P
全部配置完畢后,重啟 Nginx 或者 Reload,不出意外的話,回到瀏覽器,輸入域名(可以不帶 HTTPS,順便測試一下 301 轉發),是否一切正常?
恭喜你,你的服務器已經被標記為“安全”了!

其他
當然,啟用 SSL 加密通信,還是那個萬年不變的弊端,如果你的網站有外鏈的話,至少 IE 瀏覽器在的默認安全級別之下,始終會有個煩人的安全提示,類似“此網站不安全”!並會自動關閉掉你所有的外鏈內容讀取。本來是更加安全的通信模式,就因為這提示,反倒會讓訪問者看着不放心……
特別是越來越趨勢化的扁平設計風格,更多的引用一些開放的 JS 公共庫以達到更好的頁面效果,這時候如果啟用 SSL,至少 IE 的那個惡心提示,幾乎是無可避免的了,好在如 Gravatar 這類開放服務,都具備 HTTPS 能力支持。
后記
啟用 SSL 加密通信,不光是對通信安全的加固,更是對訪問站點的用戶的負責(至少在態度上:P),網絡安全方面的話題談起來就有點兒大了,至少有一個頂級 CA 對我們的通信進行授權和認證,這本身就是一種令人覺得舒服的事兒~
