申請 SSL 憑證啟用網站 HTTPS 安全連線

Wenchin
Wenchin Rolls Around
8 min readFeb 19, 2020

筆記:透過基於數位憑證認證機構 Let’s EncryptSSLForFree 服務,以手動認證方式申請網站安全憑證、再透過 linux 操作 Nginx,啟動架在 EC2 的虛擬伺服器 HTTPS 安全連線。

筆記 2:研究 Certbot 就不用每三個月手動申請了。

HTTPS

超文本傳輸安全協定(英語:HyperText Transfer Protocol Secure,縮寫:HTTPS;常稱為 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一種透過計算機網路進行安全通訊的傳輸協定。HTTPS經由HTTP進行通訊,但利用SSL/TLS加密封包。HTTPS開發的主要目的,是提供對網站伺服器的身分認證,保護交換資料的隱私與完整性。這個協定由網景公司(Netscape)在1994年首次提出,隨後擴展到網際網路上。

HTTPS: Connection is secure

HTTP 預設使用 port 80,而 HTTPS 預設是用 port 403。

SSL/TLS

傳輸層安全性協定(英語:Transport Layer Security,縮寫:TLS)及其前身安全通訊協定(英語:Secure Sockets Layer,縮寫:SSL)是一種安全協定,目的是為網際網路通訊提供安全及資料完整性保障。網景公司(Netscape)在1994年推出首版網頁瀏覽器網景領航員時,推出HTTPS協定,以SSL進行加密,這是SSL的起源。IETF將SSL進行標準化,1999年公布第一版TLS標準檔案。隨後又公布RFC 5246 (2008年8月)與 RFC 6176 (2011年3月)。在瀏覽器電子郵件即時通訊VoIP網路傳真等應用程式中,廣泛支援這個協定。主要的網站,如GoogleFacebook等也以這個協定來建立安全連線,傳送資料。目前已成為網際網路上保密通訊的工業標準。

白話文就是,確保伺服器與瀏覽器之間傳的資料是經過加密、安全、完整的(比較能避免被攻擊)。

SSL Server Test 可以測試網站的安全評級,告訴你哪邊可以加強。如果之後我有研究出好方法,再來寫一篇提高安全性的秘笈。

為什麼用 SSLForFree 申請憑證?

因為不用錢呀。

SSLForFree 是基於 Let’s EncryptACME (Automated Certificate Management Environment) 通訊協定產生的服務:

The Automatic Certificate Management Environment (ACME) protocol is a communications protocol for automating interactions between certificate authorities and their users’ web servers, allowing the automated deployment of public key infrastructure at very low cost. It was designed by the Internet Security Research Group (ISRG) for their Let’s Encrypt service.

但他的缺點就是只有 90 天有效,要手動更新(裝 Certbot 可幫你自動更新,可以參考 Certbot 官網)。

申請 SSL 憑證

前情提要:我在申請之前已經把 EC2 instance 綁上 Elastic IP 並用 GoDaddy DNS (Domain Name System) 指向我的 IP 了。所以以下都是用 GoDaddy 買到的那個網域在動作。

輸入想啟用 HTTPS 的網站網域名稱,子網域也可以認證(預設就會幫你申請一組 www 的)。按下 Create Free SSL Certificate。

進到這頁,按下 Manual Verification、再按下 Manually Verify Domain。

跟著指示下載那兩個檔案,並在專案資料夾中新增 .well-known 的資料夾,裡面還要有 acme-challenge 資料夾。

cd project-x
mkdir .well-known
mkdir acme-challenge

再把下載好的兩個檔案丟進 acme-challenge 資料夾。

  • 如果是用 EC2,想從本機調整架在雲端的虛擬伺服器的資料夾,可以用 linux scp (secure copy) 指令:
scp -i path/to/key file/to/copy user@ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com:path/to/file
  • 記得要開在靜態檔案路徑(例如 /public),不然 SSLForFree 會抓不到,無法成功認證。

把檔案上傳上去後,可以點那兩個連結看看有沒有辦法下載,有就是成功的。

確認完就按下 Download SSL Certificate,沒出錯就會到這頁。可以輸入 email 讓 SSLForFree 90 天快到的前一週提醒你要到期了。

成功申請到的憑證文件

這三個檔案下載保存好,就可以透過 linux 用 Nginx 將 EC2 主機啟用 HTTPS 安全憑證。

透過 Nginx 使用 SSL 憑證

把檔案放到專案的一個資料夾裡,這邊用 /home/ec2-user/project-x/certs 當示範。路徑可以 pwd 看一下之後改 config 檔的時候要用。

改 Nginx configuration 檔案

vim /etc/nginx/conf.d/virtual.conf
  1. listen 加上 443 ssl
  2. server_name 加上網域名稱
  3. 加上 ssl_certificate 跟 ssl_certificate_key 路徑
server {  listen         80;
listen 443 ssl;
server_name example.com;
server_name www.example.com;
server_name somesubdomain.example.com;
ssl_certificate /home/ec2-user/project-x/certs/certificate.crt;
ssl_certificate_key /home/ec2-user/project-x/certs/private.key;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}

路徑寫錯可能出現的錯誤(以下少寫的一層專案資料夾名字):

nginx: [emerg] cannot load certificate "/home/ec2-user/certs/certificate.crt": BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/home/ec2-user/certs/certificate.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
  • 用 EC2 instance 伺服器的話,記得要去 security group 的 inbound rule 打開 port 443 (Type: HTTPS),才能收到 HTTPS 請求。

這樣就能成功啟動 HTTPS 了。

Reference

--

--