[料理佳餚] 用 SSL For Free 產生 SSL 憑證上傳給 Azure App Service 使用

Microsoft Azure App Service 可以允許我們自訂 SSL 憑證,雖然 Azure App Service 預設就有 SSL 加密,一開始提供的 http://xxx.azurewebsites.net URL 只要改用 https:// 一樣可以通,不過我們如果要自訂網域的話,SSL 憑證就要自己想辦法了。

我們可以向 GlobalSign、VeriSign、Entrust、…等提供 SSL 認證的業者購買,不過就在去年(2015 年)底有一間叫 Let’s Encrypt 的數位憑證認證機構推出了免費 SSL/TLS 憑證服務,有了這個服務之後我們就能免費申請憑證,有佛心來著的大神就利用 Let’s Encrypt 推出了 SSL For Free 的線上工具,讓我們直接從網路上取得 SSL 憑證,個人覺得整個取得 SSL 憑證的過程還滿順的,沒什麼障礙。

建立 .well-known/acme-challenge 網站目錄

我們先參考這篇文章 SSL For Free 免費 SSL 憑證申請,使用 Let’s Encrypt 最簡單方法教學! 操作到下圖這個步驟。

在這個步驟 SSL For Free 會要我們下載一個莫名其妙檔案,然後在網站根目錄底下建立 .well-known 目錄,底下再建立 acme-challenge 目錄,之後將這個莫名其妙的檔案放在 acme-challenge 目錄底下。

SSL For Free 服務會透過第 5 個步驟的 URL 去連接這個檔案,如果連接成功了,SSL 憑證就可以建立成功,不過事情並沒有想像中順利,當我按照步驟在我的 ASP.NET 專案上建好目錄、放好檔案,發行到 Azure 上之後直接在瀏覽器存取該 URL,我得到了一個 404。

很明顯網站看不懂那個莫名其妙的靜態檔案,我們可以這樣解決,暫時在 Web.config 加上下面這一串設定,讓對應不到 MIME Type 的靜態檔案以 text/plain 的方式回傳,待成功取得 SSL 憑證之後再改回來。

產生 SSL 憑證

我們在 Web.config 加了設定之後,那個莫名其妙的檔案就可以透過瀏覽器連得到了,然後我們按下 Download SSL Certificate 按鈕,SSL 憑證就能成功產生了。

接著我們按下 Download All SSL Certificate Files 按鈕,把 SSL 憑證下載回來,解壓縮後就可以看到下面這些檔案。

產生 PKCS#12 憑證檔

我們可以在 Azure App Service 的「自訂網域及 SSL」設定中,上傳我們的 SSL 憑證及進行 SSL 繫結。

但是 Azure 要我們上傳的憑證檔副檔名是 PFX,而我們下載回來的那些 SSL 憑證檔案並沒有副檔名是 PFX 的檔案,請別擔心,這只是 SSL 憑證展現的方式不同而已,只要轉換一下就可以了。

我們到 OpenSSL for Windows 去下載 OpenSSL 回來安裝,透過下面的指令來執行格式轉換,過程中,OpenSSL 會要我們輸入一個保護 SSL 憑證的密碼。

cd C:\OpenSSL-Win32\bin
openssl pkcs12 -export -out D:\Downloads\sslforfree\certificate.pfx -inkey D:\Downloads\sslforfree\private.key -in D:\Downloads\sslforfree\certificate.crt -certfile D:\Downloads\sslforfree\ca_bundle.crt

執行完畢後,PKCS#12 憑證檔就會產生在我們指定的目錄下面,我們只要把檔案上傳到 Azure 就可以了,底下我們看到 SSL 已經上傳成功了。

最後有兩點要注意一下:
  1. 產生的 SSL 憑證效期只要 90 天,憑證到期之後就要重新簽發,我們可以在 SSL For Free 讓冊一個帳號,讓它來發通知提醒我們憑證即將到期。
  2. Azure App Service 的「自訂網域及 SSL」功能,定價至少要選到「基本」。

參考資料

C# 指南 ASP.NET 教學 ASP.NET MVC 指引
Azure SQL Database 教學 SQL Server 教學 Xamarin.Forms 教學