在企業內部環境中,我們常會遇到這樣的架構需求:
- 對外由 Apache 提供 HTTPS 服務
- Apache 作為 Reverse Proxy
- 後端(Upstream)也是 HTTPS
- 但後端使用的是 自建 CA 或自簽憑證
這時就會產生一個很關鍵的問題:
👉 Apache 連線到後端 HTTPS 時,是否會信任該自建憑證?需要額外設定嗎?
答案是:需要,而且設定方式會直接影響整體安全性。
一、先理解一個關鍵觀念
在這個架構中:
- Browser ⇨ Apache
- Apache 是 HTTPS Server
- Apache ⇨ Backend HTTPS
- Apache 變成 HTTPS Client
也就是說:
Apache 本身必須「驗證後端 HTTPS 憑證」
而 Apache 預設 只信任系統 CA(像 Let’s Encrypt、GlobalSign)
👉 不會信任你公司自建的 CA
二、整體架構示意

Browser
│ HTTPS (Public Cert)
▼
Apache Reverse Proxy
│ HTTPS (Internal / Self-signed Cert)
▼
Backend Service
三、推薦做法(✅ 正確且安全):把自建 CA 加入 Apache 信任鏈
1️⃣ 啟用 HTTPS Proxy 功能
SSLProxyEngine On
這是基本條件,沒有它 Apache 不會用 SSL 方式連後端。
2️⃣ 啟用「完整憑證驗證」(強烈建議)
SSLProxyVerify require
SSLProxyCheckPeerName on
SSLProxyCheckPeerExpire on
這代表 Apache 會驗證:
- 憑證是否由可信 CA 簽發
- 憑證是否過期
- 憑證 CN / SAN 是否符合連線的 hostname
3️⃣ 指定「你們公司的 CA 憑證」
假設你們有一個自建 CA,檔案為:
/etc/apache2/ssl/mycorp-root-ca.pem
設定:
SSLProxyCACertificateFile /etc/apache2/ssl/mycorp-root-ca.pem
📌 重點
- 放的是 CA 憑證(不是後端 server cert)
- 如果有中繼 CA,要把完整 chain 放進同一個 PEM
4️⃣ 設定反向代理到 HTTPS 後端
ProxyPreserveHost On
ProxyPass / https://backend.internal/
ProxyPassReverse / https://backend.internal/
✔ backend.internal 必須:
- 與後端憑證 SAN / CN 一致
- 不要用 IP(否則會影響 SNI)
四、SNI 是最常踩雷的地方
如果後端:
- 同一個 IP
- 多個 HTTPS Virtual Host
那 SNI(Server Name Indication)一定要正常運作
檢查重點
ProxyPass用 hostname- 不要用
https://10.x.x.x/ - Apache 2.4 + OpenSSL 通常會自動送 SNI
檢查後端實際回傳的憑證
openssl s_client \
-connect backend.internal:443 \
-servername backend.internal \
-showcerts
如果你看到回來的是「預設憑證」,那 99% 是 SNI 沒送對。
五、不建議但常見的「偷懶作法」(❌)
直接關掉後端憑證驗證:
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
這代表什麼?
- Apache 不管連到誰都算對
- 任何中間人、DNS 污染、錯誤導向都無法察覺
⚠️ 只適合
- 暫時測試
- 極封閉實驗環境
- 絕對不建議用在正式環境
六、常見錯誤與對應原因
❌ unable to get local issuer certificate
➡ Apache 不信任該 CA
✔ 解法:補 SSLProxyCACertificateFile
❌ Hostname verification failed
➡ ProxyPass 使用的 hostname 與憑證 SAN 不符
✔ 解法:修正 DNS / 憑證 / ProxyPass URL
❌ 回到錯誤的 VirtualHost
➡ SNI 沒送對
✔ 解法:避免用 IP,確認 hostname
七、實務建議總結
| 環境 | 建議作法 |
|---|---|
| 企業內網、自建 CA | ✅ 加入 CA,完整驗證 |
| 正式環境 | ✅ 嚴格驗證 |
| 暫時測試 | ⚠️ 可暫時關驗證 |
| 長期維運 | ❌ 不建議關驗證 |
八、結語
Apache 做 HTTPS 反向代理時,它不是單純轉發流量,而是一個真正的 HTTPS Client。
只要後端使用自建憑證,就必須 正確建立信任鏈,否則不是連不上,就是留下安全風險。
這個設定一旦做好:
- 架構清楚
- 安全性完整
- 後續擴充(多後端、多站台)也會非常順