這篇文章主要講述 IIS 8 部署免費 HTTPS 。 HTTPS 是互聯網 web 大勢所趨。TaSaid 最近把機房從香港遷移到青島,趁着這次機會,觀望並折騰了幾天,在遷移中順便完成了 HTTPS 的部署。
這篇文章收錄在《Said - 從HTTP到HTTPS》系列:
- 從 HTTP 到 HTTPS - 什么是 HTTPS
- 從 HTTP 到 HTTPS - IIS 部署免費 HTTPS
- 從 HTTP 到 HTTPS - 網站部署 HTTPS 中需要做的事情
有哪些免費證書
這里只介紹在 TaSaid.com 部署HTTPS中嘗試的免費證書方案,部署在 IIS8 上。
- Let's Encrypt
- 沃通 (wosign) (不推薦)
本來在 TaSaid.com 遷移中嘗試部署過沃通 (wosign) 的簽發的免費證書,但是后來發現了 Mozilla 官網( firefox/火狐 背后的開源組織 ) 里列出了 沃通的一系列可疑行為和問題,並且沃通 "秘密" 收購 StartCom(著名的免費 HTTPS 證書 StartSSL 即其旗下產品)行為可疑, Mozilla 基金會正在考慮對沃通以及 StartCom 這兩個 CA 機構一年內新簽發的所有 SSL 證書進行封殺。
我在上一篇文章 《從 HTTP 到 HTTPS - 什么是 HTTPS》 中指出 CA 機構應該是是權威和可信的,但由於沃通當前的陷入的一系列丑聞,信任度降低,所以暫時不推薦使用沃通。並且沃通官網已暫時關閉免費 HTTPS 證書申請。
這一段內容發表於2016年10月5日,如果您在未來某天閱覽到這個內容,請即時更新了解沃通最新的動態。
所以我們這次僅推薦 Let's Encrypt。
Let's Encrypt
推薦 Let's Encrypt 理由:
- 由 ISRG(Internet Security Research Group,互聯網安全研究小組)提供服務,而 ISRG 是來自於美國加利福尼亞州的一個公益組織。Let's Encrypt 得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等眾多公司和機構的支持,發展十分迅猛。
- 極速申請 - 只要認證的網站通過驗證,當時即可頒發證書
- 免費和訪問速度兼得
- 對於域名所有權的驗證,支持兩種方式:放臨時文件進行驗證、查詢 whois 給域名所有人發郵件驗證
- 無需注冊賬戶
- 關鍵是穩定,背后的支持的組織很強大
缺點:
- 一次只能頒發3個月有效期的證書,到期之后需要自己再續上 (仍然是免費的),這點維護起來比較麻煩,不過我們可以使用工具自動續期。
- 不支持通配符泛域名 (*.demo.com),所以在申請認證是時候,要把域名都 301 跳轉到證書里包含的域名上,不然瀏覽器會彈證書錯誤。
流程
默認 Let's Encrypt 申請證書比較繁瑣,所以我們在 windows 下使用工具 letsencrypt-win-simple 進行部署,簡單方便快捷。
- 下載 letsencrypt-win-simple
- 在服務器中打開CMD,運行letsencrypt-win-simple
- 在CMD中根據簡單的命令,輸入要認證的網站域名和網站文件夾
- letsencrypt-win-simple 自動驗證域名所有權
- 驗證通過后即時頒發證書
- 部署
使用 letsencrypt-win-simple 進行自動化認證和部署
下載最新版 letsencrypt-win-simple:
本人在2016年9月15日下到的最新版是:letsencrypt-win-simple.V1.9.1.zip。
自動化認證
在服務器解壓 letsencrypt-win-simple.V1.9.1
得到文件夾,打開CMD進入到該文件夾下。
第一次運行命令會連接遠程服務器更新,並且會讓你是否輸入郵箱訂閱認證信息,可以忽略,然后讓做個選擇(忘記什么選擇了),選擇Y即可,選擇N則會中斷。
部署單個域名
-
輸入以下命令
letsencrypt.exe --accepttos --manualhost 你的域名 --webroot 你的網站物理路徑(wwwroot路徑)
letsencrypt-win-simple.V1.9.1
會自動生成臨時文件並放到網站根目錄,然后會讓 Let's Encrypt 服務器會訪問這個文件, 用於驗證這個網站是否屬於你。- 如果驗證不通過,是因為 IIS 需要修改一些配置,具體參見下文的詳細說明。
-
驗證通過后會實時頒發證書,並且
letsencrypt-win-simple.V1.9.1
會自動把證書添加到服務器中,然后直接在 IIS 中進行HTTPS部署即可。
部署多個域名
- 輸入命令
letsencrypt.exe --san
- 輸入
M
,表示此次需要認證多個域名 - 輸入網站的 host
- 輸入要認證的多個域名,用
,
號分隔,比如tasaid.com,www.tasaid.com,m.tasaid.com
- 輸入網站物理路徑,比如
C:\Users\linkFly\Documents\Said\SaidTemp
letsencrypt-win-simple.V1.9.1
會自動生成臨時文件並放到網站根目錄,然后會讓 Let's Encrypt 服務器會訪問這個文件, 用於驗證這個網站是否屬於你。- 如果驗證不通過,是因為 IIS 需要修改一些配置,具體參見下文的詳細說明。
- 驗證通過后會實時頒發證書,並且會自動把證書添加到服務器中,然后直接在 IIS 中進行HTTPS部署即可。
更多命令文檔可以 參考這里。
自動化認證單個域名
解壓 letsencrypt-win-simple.V1.9.1
文件夾,然后點擊文件夾,按住shift
,再點擊右鍵,選擇在此處打開命令窗口
(即讓控制台打開后直接定位到這個文件夾下)。
使用下面的命令:
letsencrypt.exe --accepttos --manualhost 你的域名 --webroot 你的網站路徑(wwwroot路徑)
比如 https://tasaid.com 部署的命令是這樣的:
letsencrypt.exe --accepttos --manualhost tasaid.com --webroot C:\Users\linkFly\Test
letsencrypt-win-simple
會自動生成臨時文件並放到網站根目錄 (詳情可以參考下一章節 自動化認證多個域名 ),然后會讓 Let's Encrypt 服務器會訪問這個文件, 用於驗證這個網站是否屬於你。
如果驗證通過,直接進入本文的 部署 章節即可。如果驗證不通過,是因為需要修改 IIS 的一些配置,請參考下一章節 自動化認證多個域名。
自動化認證多個域名
CMD 進入 letsencrypt-win-simple.V1.9.1
文件夾,運行如下命令:
letsencrypt.exe --san
然后會彈出一坨選項:
Let's Encrypt (Simple Windows ACME Client)
Renewal Period: 60
Certificate Store: WebHosting
ACME Server: https://acme-v01.api.letsencrypt.org/
Config Folder: C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simple\htpsacme-v01.api.letsencrypt.org
Certificate Folder: C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simpe\httpsacme-v01.api.letsencrypt.org
Loading Signer from C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simpe\httpsacme-v01.api.letsencrypt.org\Signer
Getting AcmeServerDirectory
Loading Registration from C:\Users\linkFly\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\Registration
Scanning IIS Sites
2: SAN - IIS Said (C:\Users\linkFly\Test)
3: SAN - IIS Test (C:\Users\linkFly\Demo)
W: Generate a certificate via WebDav and install it manually. S: Generate a single San certificate for multiple sites. F: Generate a certificate via FTP/ FTPS and install it manually. M: Generate a certificate manually. A: Get certificates for all hosts Q: Quit Which host do you want to get a certificate for:
Scanning IIS Sites
列出了在 IIS 中檢測到的當前已發布的網站,然后顯示了一系列指令 (W, S, F, M, A),決定你想要的操作:
- W - 生成一個證書並通過 WebDav 來進行安裝
- S - 給 IIS 當前已經發布的所有網站都部署一個證書
- F - 生成一個證書通過FTP、FTPS安裝。
- M - 通過配置手動生成證書
- A - 給 IIS 當前已經發布的所有網站各自部署上對應的證書
我們這次要認證手動認證多個域名,輸入命令:
M
接着出現讓你輸入host( Enter a host name )。 比如 http://tasaid.com 輸入的是tasaid.com
。
然后會讓你輸入要認證的多個域名 (注意這些域名要可以訪問的,因為一會兒會輪流訪問這些域名進行驗證),用,
號分隔 (Enter all Alternative Names seperated by a comma:),然后我們輸入需要驗證的域名即可:
tasaid.com,www.tasaid.com,m.tasaid.com,wap.tasaid.com
接着輸入站點部署的位置 (Enter a site path ),輸入你的網站部署的位置即可:
C:\Users\linkFly\Documents\Said\SaidTemp
然后輸入是否要指定使用者 (用戶),輸入 N
。( 一旦選擇了Y
,會讓你輸入用戶名和密碼,證書會進行用戶認證 )。
接着會在你此次認證的項目根目錄下 (wwwroot) ,根據你剛才輸入的域名列表,生成對應的臨時認證文件, Let's Encrypt 服務器會訪問這個文件,結構大概如下:
---- wwwroot(認證的網站根目錄) | -- .well-known | -- acme-challenge | -- DGz4z_A_VsgO3dilCAB8bkgurpPt-EFpLygmua3L6x8 (一個臨時文件,多個域名會有多個臨時文件)
然后 Let's Encrypt 服務器會根據剛才輸入的域名列表,用 HTTP 輪流訪問這些文件,注意這時候可能存在這個報錯:
****************************************************************************** The ACME server was probably unable to reach http://linkflys.com/.well-known/acme-challenge/DGz4z_A_VsgO3dilCAB8bkgurpPt Check in a browser to see if the answer file is being served correctly. *****************************************************************************
出現這個錯誤表示生成的這個臨時文件訪問不到,驗證不通過。
原因是因為 .well-know
這個文件夾帶了前綴.
,IIS會認為是不可識別的 MIMEType ,只需要在網站根目錄下臨時加上 mimeMap
配置即可:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <staticContent> <mimeMap fileExtension="." mimeType="text/plain" /> </staticContent> </system.webServer> </configuration>
記得驗證通過后,如果你的網站不需要這個 mimeMap
配置,要記得刪除。
如果驗證通過,會顯示下圖,這時候恭喜你驗證通過。
部署
打開 IIS,選擇對應的網站,右鍵 編輯綁定
,點擊 新增
, 類型 選擇https
,則會彈出如下界面:
輸入要綁定的域名,然后選擇頒發的證書即可。域名 日期 上午/下午
這種格式就是 Let's Encrypt
此次頒發的證書。
這個時候,使用 https 協議訪問你的域名就可以啦,比如:https://tasaid.com。
自動續訂
2016-12-29 更新, 距我首次為 IIS 部署到近日,剛好滿了 90 天,今天發現自己的證書已經過期,並且沒有自動續訂,於是又小小了折騰了一下。
按照 letsencrypt-win-simple
項目中介紹的用法和查閱的一些資料, 使用:letsencrypt --renew
命令即可以自動設立定時任務並自動更新,詳情請參考這里 和 這里。
我執行了這條命令,然而現在並沒有什么卵用,也沒有自動續訂證書,查了半天也沒有查到原因,於是特意來分享另外一種方案。
在網上找到了一個自動續訂的 GUI 軟件,叫做 certify,按照原作者的說法是可以自動配置、創建和自動續訂證書,並且到快要續訂的時候會自動發郵件給你。當然,這里我也只能等三個月之后才能確認是否如此。
首先先去 官網下載 certify ,然后在服務器上安裝。注意,certify
要求以管理員權限運行,並且要求服務器安裝了 PowerShell 4.0。 PowerShell 4.0
默認集成在 Windows Management Framework 4.0 中,而 Windows Management Framework 4.0
又依賴 Microsoft .NET Framework 4.5 (坑爹啊)。
可以查看下自己的服務器是否具備這些環境,然后按需更新即可。更新之后安裝 certify
運行。
點擊 New Contact
按鈕,創建一個聯系人,這個聯系人會在證書快要過期的時候收到續訂證書的提醒郵件,輸入自己常用的 email 即可。
然后點擊 New Certificate
,certify
會自動掃描 IIS 中的站點,然后選擇你要申請證書的域名。
點擊 Request Certificate
獲取證書,certify
會在網站根目錄下生成 .well-known
文件夾,並且會自動配置 web.config
,自動驗證證書。
驗證完成后會彈窗顯示證書已安裝。然后你就可以看到自己已經申請的證書詳細信息了,並且 IIS 中也已經自動給你配置好了證書。
吐個槽,感覺這篇文章介紹的所有的東西,都被 certify
給搞定了...
在 certify
官網上作者說這個軟件還出於 beta/alpha
階段,所以某些地方可能會出問題,如果發現證書沒有續訂或者沒有生效,點擊一下 Auto Apply
就可以了。
最后記得把網站根目錄下的 .well-known
目錄給刪掉,保持網站目錄清潔。
查看證書
在服務器中查看證書
在服務器中,Win + R
打開運行,輸入 MMC
,打開 控制台
界面。
點擊頂部菜單欄 文件
,然后點擊 添加/刪除管理單元
彈出的窗口中,在左側的 可用的管理單元 中點擊 證書
,然后點中間的 添加
,會彈出如下界面:
選擇 計算機賬戶
,然后默認下一步完成,點擊 確定
,即可看到證書列表。
展開 證書
,再展開 中間證書頒發機構
,選擇 證書
,即可看到 Let's Encrypt
頒發的證書:
在chrome中查看證書
使用 HTTPS 訪問網址,點擊地址欄的小 綠鎖
,然后點擊 詳細信息
,這時候會彈出 chrome 調試工具,點擊 View certificate
:
就會看到證書的詳細信息:
其他
IIS 配置 web.config 實現自動 HTTPS 跳轉
為了保證域名統一,將訪問 http://www.tasaid.com
、http://tasaid.com
、https://www.tasaid.com
的域名都跳轉到 https://tasaid.com
,IIS 可以進行如下配置 (需要安裝 IIS UrlRewrite 模塊,代碼注釋是為了方便理解,部署到線上請刪除中文注釋):
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="HostNameRule1"> <match url="(.*)" /> <!--匹配所有條件--> <conditions logicalGrouping="MatchAny"> <!--當不是使用https協議訪問的時候--> <add input="{HTTPS}" pattern="^OFF$" /> <!--並且訪問的host不是tasaid.com這種,例如www.tasaid.com--> <add input="{HTTP_HOST}" pattern="^tasaid\.com$" negate="true" /> </conditions> <!--跳轉到https--> <action type="Redirect" url="https://tasaid.com/{R:1}" /> </rule> <rule name="HTTPS redirect"> <match url="(.*)" /> <conditions> <!--當使用HTTPS協議訪問--> <add input="{HTTPS}" pattern="^ON$" /> <!--當訪問 https://www.tasaid.com的時候 --> <add input="{HTTP_HOST}" pattern="^tasaid\.com$" negate="true" /> </conditions> <!--跳轉到HTTPS--> <action type="Redirect" url="https://tasaid.com/{R:1}" redirectType="SeeOther" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
這里需要注意,想讓 https://www.tasaid.com 也可以跳轉到 https://tasaid.com,在申請 HTTPS 證書的時候,要把 www.tasaid.com
這種域名也給申請上,否則瀏覽器會解析不出 https://www.tasaid.com
,因為在進行 HTTPS 加密握手的時候就會認證失敗。
chrome 調試中發現 HTTPS 改動不生效
HTTPS 第一次連接域名的時候會和證書頒發機構進行 HTTPS 證書認證,后續的連接會緩存起來,清緩存就好了
來源:https://tasaid.com/blog/20161005024923.html?sgs=sf1190000007064737