Logo

新人日誌

首頁關於我部落格

新人日誌

Logo

網站會不定期發佈技術筆記、職場心得相關的內容,歡迎關注本站!

網站
首頁關於我部落格
部落格
分類系列文

© 新人日誌. All rights reserved. 2020-present.

本文為「新手也看得懂的 DNS 網域解析」系列第 4 篇

AWS Certificate Manager(ACM)是什麼?免費申請 SSL 憑證並部署到 EC2 完整教學

最後更新:2026年4月15日架構

你有沒有想過,為什麼有些網站的網址前面有個小鎖頭,有些卻沒有?

那個小鎖頭代表網站有 SSL/TLS 憑證,讓你跟網站之間的傳輸是加密的、安全的。

以前要取得 SSL 憑證,你得花錢購買、手動上傳、每年還要記得更新,非常麻煩。

現在 AWS 提供了一個服務叫做 AWS Certificate Manager(簡稱 ACM),可以幫你免費申請、自動更新 SSL 憑證,整個過程省時又省事。

這篇文章會一步步帶你:

  1. 用 ACM 申請免費的 SSL/TLS 憑證
  2. 建立一個跑在 EC2 上的簡單網站
  3. 建立 Application Load Balancer(ALB),把憑證掛上去
  4. 設定讓 HTTP 自動轉向 HTTPS

讀完這篇文章,你就能讓自己的網站從「不安全」變成有小鎖頭的安全網站。

SSL/TLS 憑證是什麼?它在傳輸過程中扮演什麼角色?

要理解 ACM 在做什麼,你需要先知道 SSL/TLS 憑證的概念。

憑證解決了什麼問題:加密傳輸和驗證身份

第一:加密傳輸。

當你的瀏覽器跟網站之間傳資料,如果沒有加密,中間的人是可以看到內容的(例如你送出的表單、帳號密碼)。

SSL/TLS 憑證讓這段傳輸變成加密過的,就算被攔截也看不懂。

第二:驗證身份。

憑證是由一個受信任的機構(叫做 CA,Certificate Authority)核發的,代表「這個網站的擁有者確實是他說的那個人」。

瀏覽器上的小鎖頭,其實是在說:「這個網站的身份我查過了,傳輸也是加密的,你可以放心。」

憑證在傳輸鏈中的位置

一個使用者從輸入網址到看到你的網站,中間會經過這幾層:

憑證掛在哪裡,加密就到哪裡。

舉例來說,如果憑證掛在 Load Balancer 上,那瀏覽器到 Load Balancer 這段傳輸就是加密的。

而 Load Balancer 到伺服器這段,因為走的是 AWS 內部網路、不會經過公開的網際網路,所以通常不需要另外加密。

反過來說,如果你把憑證直接裝在伺服器上(像 Let’s Encrypt 的做法)呢?

那使用者送出的資料(像帳號密碼、表單內容),會一路加密到伺服器才被解開。

前面就算有 Load Balancer 或 CDN,它們也不負責處理加密,單純做流量分配,加密的工作全部由伺服器自己來。

這也是為什麼不同的 SSL 服務會跟不同的東西有關:

  • 跟部署有關(如 Let’s Encrypt):憑證直接裝在你的伺服器上,由伺服器自己處理加密
  • 跟 CDN 有關(如 Cloudflare):流量先進 Cloudflare 的節點,由 Cloudflare 處理加密,你的伺服器不用裝憑證
  • 跟 AWS 服務有關(如 ACM):憑證掛在 AWS 的 Load Balancer 或 CloudFront 上,由這些服務處理加密

AWS Certificate Manager(ACM)是什麼?

AWS Certificate Manager(ACM) 是 AWS 提供的一個憑證管理服務。

你可以把它想成一個「憑證的管理中心」,專門負責幫你申請、儲存、部署和自動更新 SSL/TLS 憑證。

ACM 做的事情,大概分成三塊:

功能說明
申請憑證直接在 AWS 上申請免費的公開憑證,不用跑到其他憑證機構
管理憑證所有憑證集中在 ACM 控制台管理,一目了然
自動更新只要憑證還在使用、DNS 記錄還在,ACM 會在到期前自動幫你更新
說明直接在 AWS 上申請免費的公開憑證,不用跑到其他憑證機構
說明所有憑證集中在 ACM 控制台管理,一目了然
說明只要憑證還在使用、DNS 記錄還在,ACM 會在到期前自動幫你更新

如果你已經有從其他地方購買的憑證,也可以把它匯入(import)到 ACM 集中管理,非常彈性。

ACM 和其他 SSL 憑證服務有什麼差別?

你可能聽過 Let’s Encrypt、Cloudflare 或其他憑證服務,也都能拿到免費的 SSL 憑證。

那為什麼要用 ACM?

它和其他服務的差別在哪?

項目ACMLet’s EncryptCloudflareDigiCert / Sectigo
費用免費免費免費(基本方案)付費
自動更新✅ 全自動⚠️ 需自行設定排程✅ 全自動✅ 付費方案支援
可以裝在任何伺服器?❌ 只能掛在 AWS 服務✅ 可以❌ 流量需經過 Cloudflare✅ 可以
跟 AWS 服務整合✅ 原生支援❌ 需手動處理❌ 需手動處理❌ 需手動處理
適合對象已在用 AWS 的團隊自己管伺服器的開發者同時需要 CDN 的人企業、需要 EV 憑證
ACM免費
Let’s Encrypt免費
Cloudflare免費(基本方案)
DigiCert / Sectigo付費
ACM✅ 全自動
Let’s Encrypt⚠️ 需自行設定排程
Cloudflare✅ 全自動
DigiCert / Sectigo✅ 付費方案支援
ACM❌ 只能掛在 AWS 服務
Let’s Encrypt✅ 可以
Cloudflare❌ 流量需經過 Cloudflare
DigiCert / Sectigo✅ 可以
ACM✅ 原生支援
Let’s Encrypt❌ 需手動處理
Cloudflare❌ 需手動處理
DigiCert / Sectigo❌ 需手動處理
ACM已在用 AWS 的團隊
Let’s Encrypt自己管伺服器的開發者
Cloudflare同時需要 CDN 的人
DigiCert / Sectigo企業、需要 EV 憑證

ACM 最大的優勢有兩個:

優勢一:跟 AWS 原生整合

申請完憑證,直接在 Load Balancer 或 CloudFront 的設定頁面選一下就掛上去了,不需要手動下載、上傳、設定。

優勢二:完全不用管更新

Let’s Encrypt 的憑證每 90 天到期一次,你必須自己在伺服器設定自動更新腳本。

ACM 只要憑證還在使用、DNS 記錄還在,就會自動幫你更新,完全不用動。

限制:憑證無法下載,只能用在 AWS 服務上

你沒辦法把憑證下載下來,裝到自己的伺服器上。

ACM 的憑證只能透過 AWS 的服務來使用(像是掛在 Load Balancer 或 CloudFront 上),沒辦法拿到憑證檔案自己安裝。

所以如果你的伺服器不在 AWS(例如放在 DigitalOcean 或自己的機房),那 Let’s Encrypt 會是更適合的選擇,因為它可以直接在任何伺服器上安裝。

為什麼不能直接把 ACM 憑證裝在 EC2 上?

這是很多人第一次碰到 ACM 時會有的疑問:免費憑證為什麼不能直接裝在 EC2 上?

原因是 ACM 的免費憑證只能跟特定的 AWS 服務搭配使用,不能直接匯出來裝到伺服器上。

目前支援 ACM 憑證的服務有:

  • Elastic Load Balancing(ALB / NLB)(負載平衡器,分配流量到多台伺服器)← 這篇文章用這個
  • Amazon CloudFront(CDN,讓全球使用者都能快速載入你的網站)
  • Amazon Cognito(使用者登入和身份驗證服務)
  • AWS Elastic Beanstalk(自動幫你部署和管理應用程式的服務)
  • Amazon API Gateway(讓你建立和管理 API 的入口)
  • AWS Nitro Enclave(在 EC2 裡建立隔離環境,處理高度機密的資料)

所以我們的架構是這樣的:使用者 → Load Balancer(掛著 SSL 憑證)→ EC2 實例。

Load Balancer 負責處理 HTTPS,EC2 只要正常跑 HTTP 就好。

申請 ACM 憑證前的事前準備

在開始之前,請確認你有以下兩件事:

準備一:一個可以修改 DNS 記錄的網域

你需要一個網域名稱,而且你可以新增 DNS 記錄(例如在 Route 53 購買的網域)。

為什麼需要這個?

因為 ACM 在核發憑證之前,會要求你證明「這個網域真的是你的」。

驗證的方式是:ACM 會給你一筆 CNAME 記錄,你必須把它加到你的 DNS 設定裡。

ACM 偵測到這筆記錄後,才會核發憑證給你。

所以如果你無法修改 DNS 記錄,就沒辦法完成驗證。

為什麼 ACM 用 CNAME 來驗證,而不是 TXT?

其實用 TXT 記錄來驗證網域更常見,像 Google Search Console 就是這樣做的。

但 TXT 有一個問題:驗證資料是直接寫在你的 DNS 裡的,AWS 沒辦法從遠端修改它。

CNAME 則不同,它是一個「指向」,指向 AWS 自己控制的網域。

真正的驗證資料放在 AWS 那端,AWS 可以自己管理和更新,你的 DNS 從頭到尾都不用動。

這個差別在續約的時候特別重要。

SSL 憑證是有期限的,到期前 ACM 會自動幫你續約,但續約前需要重新確認你還是網域的擁有者(因為你可能已經把網域賣掉了)。

如果用 CNAME,ACM 可以在自己那端完成這個重新驗證,全程自動,你什麼都不用做。

如果用 TXT,萬一 AWS 需要更新驗證資料,就得通知你手動去改 DNS,沒辦法全自動。

下面用具體的例子來比較兩者的差別:

用 CNAME 的情況(ACM 的做法)

你在 DNS 加的記錄長這樣:

類型名稱值(指向)
CNAME_abc123.example.com_abc123.acm-validations.aws
名稱_abc123.example.com
值(指向)_abc123.acm-validations.aws

這筆 CNAME 指向的是 _abc123.acm-validations.aws,這是 AWS 自己擁有的網域底下的一個子網域。

就像你擁有 example.com,可以在底下建立任何記錄一樣,AWS 擁有 acm-validations.aws,也可以在底下建立任何記錄。

所以 AWS 就在自己的網域底下,建了一筆 TXT 記錄在 _abc123.acm-validations.aws 這個位置,裡面放著驗證用的資料。

類型名稱值誰建的
TXT_abc123.acm-validations.aws(AWS 產生的驗證資料)AWS 自己建的
名稱_abc123.acm-validations.aws
值(AWS 產生的驗證資料)
誰建的AWS 自己建的

這不是你建的 TXT 記錄,是 AWS 在自己的網域上建的。

整個驗證流程是這樣的:

  1. ACM 去查 _abc123.example.com(你的網域)
  2. 發現這是一筆 CNAME,指向 _abc123.acm-validations.aws(AWS 的網域)
  3. 順著指向過去,找到 AWS 放在那裡的 TXT 記錄
  4. 比對 TXT 記錄裡的驗證資料,確認沒問題,驗證通過

續約的時候也是走同樣的流程。

如果 AWS 需要更新驗證資料,它只要改自己網域上那筆 TXT 記錄就好,因為那筆記錄本來就在 AWS 的地盤上。

你的 DNS 記錄從頭到尾都不用動,因為 CNAME 只是一個「指向」,真正的驗證資料在 AWS 自己的網域上。

如果改用 TXT 的情況(假設)

假設 ACM 改成要你直接在 DNS 加一筆 TXT 記錄:

類型名稱值
TXT_abc123.example.com(AWS 產生的驗證資料)
名稱_abc123.example.com
值(AWS 產生的驗證資料)

這筆驗證資料就直接寫死在你的 DNS 裡了。

如果續約時 ACM 需要更新驗證資訊,它沒辦法幫你改,因為那筆記錄在你的 DNS、不在 AWS 的伺服器上。

你就得自己登入 DNS 去手動修改,否則驗證會失敗。

差別就在這裡: CNAME 把驗證「委託」到 AWS 的伺服器上,AWS 可以自己管理驗證資料;TXT 是把驗證資料直接放在你的 DNS,AWS 碰不到,要改就得你自己來。

準備二:確認你要使用的 AWS 區域(Region)

後續所有服務都要建立在同一個區域。

為什麼需要這個?

因為 ACM 的憑證是綁定區域的。

舉例來說,如果你在 us-east-1(美國東部)申請了一張憑證,那這張憑證只能給同樣在 us-east-1 的 Load Balancer 使用,沒辦法跨區域掛到 us-west-2(美國西部)的 Load Balancer 上。

所以在開始之前,先決定好要用哪個區域,後續的 ACM、EC2、Load Balancer 都建在同一個區域,就不會遇到找不到憑證的問題。

這篇文章使用的網域是 example.com,示範用的完整網址是 demo.example.com。

第一步:用 ACM 申請 SSL 憑證

進入 ACM 控制台

登入 AWS 後,在搜尋欄位輸入 Certificate Manager,然後點進去。

點選左側選單的「List certificates」,你會看到目前所有的憑證清單。

申請公開憑證

ACM 提供兩種憑證:

類型說明費用
公開憑證(Public)給公開網站用的,瀏覽器會自動信任,網址列會出現小鎖頭免費
私有憑證(Private)給公司內部服務用的(例如伺服器之間的溝通),瀏覽器不會自動信任需要額外付費建立 Private CA
說明給公開網站用的,瀏覽器會自動信任,網址列會出現小鎖頭
費用免費
說明給公司內部服務用的(例如伺服器之間的溝通),瀏覽器不會自動信任
費用需要額外付費建立 Private CA

簡單來說,如果你的網站是給一般使用者瀏覽的(像部落格、電商、公司官網),就是選公開憑證。

私有憑證通常是大公司才會用到,例如公司內部有好幾台伺服器需要互相溝通,這些溝通不會經過瀏覽器,但也需要加密,這時候才會用私有憑證。

這篇文章要做的是讓網站出現小鎖頭,所以選公開憑證。

點選右上角的「Request」按鈕。

確認選的是「Request a public certificate」,然後按「Next」。

填入網域名稱(FQDN)

在「Fully Qualified Domain Name(FQDN)」欄位,填入你要保護的網址。

FQDN 的中文是「完整網域名稱」,意思是包含所有層級的完整網址。

舉個例子,example.com 是你的網域(domain),但你的網站可能跑在 demo.example.com、www.example.com 或 blog.example.com 這些不同的子網域上。

ACM 需要你填的是完整的網址,而不只是主網域,因為憑證是針對特定的完整網址來核發的。

例如:demo.example.com

如果你想用一張憑證同時保護多個子網域(像是 www.example.com、blog.example.com),不用一個一個申請,可以使用萬用字元(wildcard)的寫法,填 *.example.com 就好。

這樣所有 example.com 底下的子網域都會受到保護。

選擇驗證方式

AWS 需要確認你真的擁有這個網域,提供兩種驗證方式:

驗證方式說明
DNS 驗證(建議)在 DNS 新增一筆 CNAME 記錄,ACM 會自動偵測並自動更新憑證
電子郵件驗證寄信到網域的管理員信箱,手動點擊確認連結
說明在 DNS 新增一筆 CNAME 記錄,ACM 會自動偵測並自動更新憑證
說明寄信到網域的管理員信箱,手動點擊確認連結

建議選「DNS validation」,因為 ACM 可以自動幫你更新憑證,不用每年手動處理。

如果選電子郵件驗證,每次憑證快到期時,AWS 都會寄一封確認信到你的網域管理員信箱,你必須手動點擊信裡的連結才能完成續約。

沒點的話,憑證就會過期失效。

選擇加密演算法

在「Key algorithm」選 RSA 2048,這是目前最廣泛支援的格式。

確認後按「Request」送出申請。

第二步:驗證網域所有權

送出申請後,憑證狀態會顯示「Pending validation」,代表還在等待驗證。

點進憑證 ID,在「Domains」區塊你會看到一筆 CNAME 記錄的資訊,你需要把這筆記錄加到你的 DNS 設定裡。

在 Route 53 新增 CNAME 記錄

如果你的網域是用 Route 53 管理的,最快的方式是直接在 ACM 頁面點「Create records in Route 53」,AWS 會自動幫你把 CNAME 記錄加到 DNS 裡,不用手動複製貼上。

如果你用的不是 Route 53,就需要手動新增。

開啟你的 DNS 服務商後台,新增一筆 CNAME 記錄,依照以下設定填入:

欄位填入值
Record name從 ACM 複製的 CNAME 名稱(移除最後的 .example.com,因為已經自動補上)
Record typeCNAME
Value從 ACM 複製的 CNAME 值
填入值從 ACM 複製的 CNAME 名稱(移除最後的 .example.com,因為已經自動補上)
填入值CNAME
填入值從 ACM 複製的 CNAME 值

舉例來說,ACM 給你的值可能長這樣:

欄位實際範例
Record name_abc123def456
Record typeCNAME
Value_abc123def456.acm-validations.aws
實際範例_abc123def456
實際範例CNAME
實際範例_abc123def456.acm-validations.aws

每個人拿到的值都不一樣,直接從 ACM 頁面複製貼上就好,不需要自己編。

填好後按「Create records」。

等待幾分鐘讓 DNS 傳播,當狀態顯示「In sync」就代表完成了。

確認憑證已核發

回到 ACM,重新整理頁面。

如果憑證狀態從「Pending validation」變成「Issued」,就表示憑證已成功核發。

這時「In use?」欄位會顯示「No」,因為我們還沒把憑證掛到任何服務上。

第三步:建立 EC2 實例並啟動網站

建立 EC2 實例

在 AWS 控制台搜尋「EC2」,進入後點「Launch instance」。

依照以下設定建立實例:

設定項目建議值
Namessl-demo
AMIAmazon Linux 2023(免費方案)
Architecture64-bit (x86)
Instance typet2.micro(免費方案)
Key pair新建一個,例如命名為 ssl-demo-key,下載 .pem 檔妥善保存
建議值ssl-demo
建議值Amazon Linux 2023(免費方案)
建議值64-bit (x86)
建議值t2.micro(免費方案)
建議值新建一個,例如命名為 ssl-demo-key,下載 .pem 檔妥善保存

在「Network settings」裡,你會看到兩個重要的設定:

  • VPC(Virtual Private Cloud):你在 AWS 裡的私有網路,所有的 AWS 資源(EC2、Load Balancer 等)都要放在某個 VPC 裡面,同一個 VPC 裡的資源才能互相溝通。
  • 安全群組(Security Group):一組防火牆規則,用來控制哪些流量可以進出你的資源。例如你可以設定「只允許 HTTP 和 HTTPS 的流量進來」。

VPC 維持預設的就好。

AWS 會自動幫你建一個預設的 VPC,如果你沒有特別建過其他 VPC,這裡只會有一個選項,直接用它就好。

記下這個 VPC 的名稱或 ID(例如 vpc-0abc123def),因為後面建立 Load Balancer 時要選同一個,EC2 和 Load Balancer 必須在同一個 VPC 裡才能互相溝通。

安全群組(Security Group) 選「Create security group」讓 AWS 自動建立一個新的。

記下這個安全群組的名稱(例如 launch-wizard-1),後面建立 Load Balancer 時也要選同一個。

務必勾選允許 HTTP 和 HTTPS 流量。

在「Storage」維持預設的 8GB GP3 SSD 就好。

用 User Data 自動安裝網頁伺服器

展開「Advanced details」,找到最下方的「User data」欄位。

貼上以下指令碼,這段程式碼會自動安裝 Apache 並建立一個簡單的 Hello World 網頁:

#!/bin/bash
yum update -y
yum install -y httpd
systemctl start httpd
systemctl enable httpd
echo "<h1>Hello World from AWS Certificate Manager SSL/TLS Demo</h1>" > /var/www/html/index.html

確認設定無誤後,按「Launch instance」。

確認網站正常運作

等到實例狀態從「Pending」變成「Running」,複製「Public IPv4 address」,在瀏覽器開啟。

如果看到「Hello World…」,代表 EC2 網站已正常運作。

這時網址列會顯示「不安全」,因為我們還沒有掛上 SSL 憑證,這是正常的。

第四步:建立 Application Load Balancer

進入 Load Balancer 設定頁面

在 EC2 控制台左側選單,找到「Load Balancing > Load Balancers」,點「Create load balancer」。

選擇「Application Load Balancer」,因為它支援 HTTP 和 HTTPS,適合我們的情境。

ALB 基本設定

設定項目填入值
NamesslDemoALB
SchemeInternet-facing
IP address typeIPv4
填入值sslDemoALB
填入值Internet-facing
填入值IPv4

在「Network mapping」選你的 VPC,然後選取所有 Availability Zones(至少要包含你 EC2 所在的那個區域)。

設定安全群組

移除預設的安全群組,改選你在建立 EC2 時使用的安全群組(例如 launch-wizard-2)。

建立 Target Group(目標群組)

Target Group 是告訴 Load Balancer 要把流量送到哪裡的設定。

在「Listeners and routing」區塊,HTTP 那一列按「Create target group」:

第一步:選擇目標類型

選「Instances」,因為我們要把流量導向 EC2 實例。

第二步:填入基本設定

設定項目填入值
Target group namesslDemoHTTPTG
ProtocolHTTP
Port80
填入值sslDemoHTTPTG
填入值HTTP
填入值80

第三步:把 EC2 加進 Target Group

前面只是建立了 Target Group,但裡面還是空的,還沒有告訴它「流量要送到哪一台機器」。

這一步就是把你的 EC2 實例加進去,這樣 Load Balancer 收到流量時,才知道要轉給誰。

在下一頁,勾選你剛建立的 EC2 實例,確認 Port 是 80(代表 Load Balancer 會把流量送到 EC2 的 80 port,也就是 Apache 網頁伺服器在監聽的 port),按「Include as pending below」,再按「Create target group」。

設定 HTTP 和 HTTPS 監聽器

監聽器(Listener)是告訴 Load Balancer「要在哪個 port 接收流量,收到後送去哪裡」。

我們需要設定兩個監聽器:

  • HTTP(Port 80):接收一般的 HTTP 流量
  • HTTPS(Port 443):接收加密的 HTTPS 流量

兩個監聽器收到流量後,都會送到同一個 Target Group(也就是你的 EC2)。

回到 Load Balancer 設定頁面,HTTP 監聽器預設已經建好了,在它的「Default action」選擇剛建立的 Target Group。

接著按「Add listener」新增 HTTPS 監聽器:

設定項目填入值
ProtocolHTTPS
Port443
Default action選擇同一個 Target Group
填入值HTTPS
填入值443
填入值選擇同一個 Target Group

把 ACM 憑證掛到 Load Balancer 上

在「Secure listener settings」區塊:

  1. Certificate source 選「From ACM」
  2. 在下拉選單選擇你剛才申請的憑證(demo.example.com)

其他設定維持預設,確認後按「Create load balancer」。

等待約 2 分鐘,狀態從「Provisioning」變成「Active」就完成了。

第五步:設定 DNS A 記錄指向 Load Balancer

到目前為止,Load Balancer 已經建好了、憑證也掛上去了,但使用者還沒辦法透過 demo.example.com 連到你的網站。

為什麼?因為 demo.example.com 這個網址還沒有跟 Load Balancer 連起來。

Load Balancer 有自己的位址,但那是一串很長的 AWS 內部網址(像是 sslDemoALB-123456.us-west-2.elb.amazonaws.com),沒有人會記得這種網址。

所以這一步要做的事情是:在 DNS 新增一筆 A 記錄,讓 demo.example.com 指向你的 Load Balancer。

這樣使用者輸入 demo.example.com 時,DNS 會自動把他導向 Load Balancer,Load Balancer 再把流量轉給 EC2。

這篇文章使用的是 Route 53,所以可以直接用 Alias A 記錄來指向 Load Balancer。

Load Balancer 建立完成後,在詳細資訊頁面找到「DNS name」,這是 Load Balancer 的位址。

開啟 Route 53,在你的 Hosted Zone 新增一筆 A 記錄:

設定項目填入值
Record namessl-demo(.example.com 會自動補上)
Record typeA
Alias啟用
Route traffic toAlias to Application and Classic Load Balancer
Region你的 EC2 所在區域(例如 us-west-2)
Load balancer選擇你剛建立的 Load Balancer
填入值ssl-demo(.example.com 會自動補上)
填入值A
填入值啟用
填入值Alias to Application and Classic Load Balancer
填入值你的 EC2 所在區域(例如 us-west-2)
填入值選擇你剛建立的 Load Balancer

按「Create records」,等待狀態變成「In sync」。

完成後,用瀏覽器開啟 https://demo.example.com,你會看到網站,而且網址列會出現小鎖頭!

如果你用的不是 Route 53 怎麼辦?

一般的 A 記錄需要填一個固定的 IP 位址(像 52.68.123.45),但 Load Balancer 沒有固定 IP,背後的 IP 會隨時變動,AWS 會根據流量自動調整。

所以你沒辦法用普通的 A 記錄指向 Load Balancer,因為根本沒有一個固定的 IP 可以填。

這時候就改用 CNAME 記錄,因為 CNAME 填的是另一個網域名稱(不是 IP),可以直接指向 Load Balancer 的 DNS 名稱。

DNS 服務商能用 A 記錄指向 LB 嗎做法
Route 53✅ 可以(用 Alias)選 Load Balancer,Route 53 自動處理 IP 變動
其他服務商❌ 不行(LB 沒有固定 IP)用 CNAME 指向 LB 的 DNS 名稱
能用 A 記錄指向 LB 嗎✅ 可以(用 Alias)
做法選 Load Balancer,Route 53 自動處理 IP 變動
能用 A 記錄指向 LB 嗎❌ 不行(LB 沒有固定 IP)
做法用 CNAME 指向 LB 的 DNS 名稱

不過要注意,CNAME 只能用在子網域(像 www.example.com、ssl-demo.example.com),不能用在根網域(像 example.com),這是 DNS 規範的限制。

這不代表根網域就不能有 SSL 憑證。

SSL 憑證和 DNS 指向是兩件不同的事:憑證負責加密,DNS 負責把流量導到正確的地方。

ACM 核發憑證只需要你證明網域是你的(就是前面講的 CNAME 驗證),跟你用哪家 DNS 服務商沒有關係。

所以就算你用 GoDaddy,ACM 一樣可以核發 example.com 的憑證,憑證照樣掛在 Load Balancer 上。

真正的問題是:使用者在瀏覽器輸入 example.com 的時候,流量要怎麼到達你的 Load Balancer?

這件事是 DNS 在處理的,跟憑證無關。

Route 53 的 Alias 怎麼解決這個問題?

Route 53 有一個特殊功能叫 Alias,它讓 A 記錄可以直接指向 AWS 的服務(像 Load Balancer)。

你只要選 Load Balancer,Route 53 會在背後自動去查目前的 IP 是什麼,然後動態回應給使用者。

對你來說看起來像是設了一筆普通的 A 記錄,但其實 Route 53 在背後幫你處理了 IP 變動的問題。

而且 Alias A 記錄不受根網域的限制,example.com 也能直接指向 Load Balancer,不需要繞路。

如果你的 DNS 服務商不支援 Alias 怎麼辦?

如果你用的是 GoDaddy 等不支援 Alias、ANAME 功能的服務商,常見的做法是:

  1. 用 GoDaddy 的「網域轉址(Forwarding)」功能,把 example.com 自動轉到 www.example.com
  2. 再用 CNAME 把 www.example.com 指向 Load Balancer
    第一步:設定網域轉址

在 GoDaddy 後台的「Forwarding」設定:

欄位填入值
Forward tohttps://www.example.com
Forward typePermanent (301)
填入值https://www.example.com
填入值Permanent (301)

第二步:新增 CNAME 記錄

在 GoDaddy 後台的「DNS Records」新增一筆:

欄位填入值
類型CNAME
名稱www
值Load Balancer 的 DNS name(從 AWS 控制台複製)
填入值CNAME
填入值www
填入值Load Balancer 的 DNS name(從 AWS 控制台複製)

這樣使用者不管輸入 example.com 還是 www.example.com,最終都會到 Load Balancer,而且都有 SSL 加密。

第六步:讓 HTTP 自動轉向 HTTPS

目前 HTTP 和 HTTPS 都能進入網站,但為了讓所有流量都走安全的 HTTPS,我們要修改 HTTP 監聽器的行為。

在 Load Balancer 頁面,點選「Listeners and rules」標籤。

找到 HTTP(Port 80)那一列,點「Manage listener > Edit listener」。

在「Routing actions」改選「Redirect to URL」,然後選「Full URL」,填入:

https://demo.example.com:443

Status code 選「301 Moved Permanently」,按「Save changes」。

設定完成後,當使用者輸入 http://demo.example.com,瀏覽器會自動跳轉到 https://demo.example.com,完全透明、不需要使用者做任何事。

小結:從申請 ACM 憑證到啟用 HTTPS 的完整流程

這篇文章帶你完成了以下幾件事:

  • 申請免費 SSL 憑證:透過 ACM 申請 DNS 驗證的公開憑證,AWS 會自動更新,不用每年手動處理。
  • 建立 EC2 網站:用 User Data 自動安裝 Apache 並建立簡單網頁。
  • 建立 Application Load Balancer:掛上 SSL 憑證,讓 HTTPS 流量可以安全進入。
  • 設定 DNS A 記錄:讓自訂網域指向 Load Balancer。
  • HTTP 自動轉 HTTPS:確保所有流量都走加密連線。

完成後,點擊瀏覽器上的小鎖頭,你可以看到憑證由 Amazon 核發,有效期超過一年,完全免費。

上一篇DNS 中 CNAME 記錄怎麼用?你的子網域可以這樣設定
下一篇DNS 中的 MX 記錄是什麼?一篇搞懂收信背後的關鍵設定
目前還沒有留言,成為第一個留言的人吧!

發表留言

留言將在審核後顯示。

架構

目錄

  • SSL/TLS 憑證是什麼?它在傳輸過程中扮演什麼角色?
  • 憑證解決了什麼問題:加密傳輸和驗證身份
  • 憑證在傳輸鏈中的位置
  • AWS Certificate Manager(ACM)是什麼?
  • ACM 和其他 SSL 憑證服務有什麼差別?
  • 為什麼不能直接把 ACM 憑證裝在 EC2 上?
  • 申請 ACM 憑證前的事前準備
  • 準備一:一個可以修改 DNS 記錄的網域
  • 準備二:確認你要使用的 AWS 區域(Region)
  • 第一步:用 ACM 申請 SSL 憑證
  • 進入 ACM 控制台
  • 申請公開憑證
  • 填入網域名稱(FQDN)
  • 選擇驗證方式
  • 選擇加密演算法
  • 第二步:驗證網域所有權
  • 在 Route 53 新增 CNAME 記錄
  • 確認憑證已核發
  • 第三步:建立 EC2 實例並啟動網站
  • 建立 EC2 實例
  • 用 User Data 自動安裝網頁伺服器
  • 確認網站正常運作
  • 第四步:建立 Application Load Balancer
  • 進入 Load Balancer 設定頁面
  • ALB 基本設定
  • 設定安全群組
  • 建立 Target Group(目標群組)
  • 設定 HTTP 和 HTTPS 監聽器
  • 把 ACM 憑證掛到 Load Balancer 上
  • 第五步:設定 DNS A 記錄指向 Load Balancer
  • 第六步:讓 HTTP 自動轉向 HTTPS
  • 小結:從申請 ACM 憑證到啟用 HTTPS 的完整流程