解決 Let's Encrypt 和 Cloudflare 混用時的問題

Cloudflare 的 IPv6 proxy 可能會造成在申請 Let's Encrypt 憑證時的問題,利用 Cloudflare 的模擬 IPv4 功能可以解決。

Cloudflare 是著名的 DNS 和 CDN 服務商,Let's Encrypt 則是簽發 TLS 憑證的非營利組織,這篇講的是當一個有用到 Cloudflare DNS 和 CDN 服務的網站,在向 Let's Encrypt 申請 TLS 憑證時可能會出現的問題以及解決方式。

問題

除了 Cloudflare 和 Let's Encrypt 外,其實場景內也有用到 Plesk,但與核心問題無關,就不多加著墨了。

當用 Plesk 的 Let's Encrypt 模組申請憑證時,弱這個網站的 DNS 是由 Cloudflare 代管,且有啟用 Cloudflare CDN(橘色小雲)的話,有可能會看到這樣的錯誤訊息:「The example.com DNS zone contains an AAAA record, but the domain is not assigned an IPv6 address in Plesk.」,意思就是說 Let's Encrypt 在做簽發驗證時向 DNS 查詢得到一組 IPv6 的 AAAA 紀錄,但網站的 IP 卻不是這組 IPv6 的 AAAA 紀錄。

原因

Cloudflare 如果有開啟 Cloudflare CDN 服務的話,則 DNS 的紀錄就會被指向 Cloudflare proxy 機器的 IP,而且不僅是 IPv4 的 A 紀錄,也會有 IPv6 的 AAAA 紀錄,但在 CDN 之後的我們的真實網站主機是沒有 IPv6 的,因此 Plesk 才會提示錯誤訊息。

解決辦法

最直覺的作法就是把 Cloudflare 的 IPv6 proxy 關掉,但這是不可行的,Cloudflare 的政策是強制開啟 IPv6,為了更美好的未來:

Cloudflare IPv6

雖然關不掉 IPv6,但還是有辦法解決,Cloudflare 的網路頁有一個「模擬 IPv4」的區塊,預設是關閉,可以把這項設成「新增標頭」,再去 Plesk 的 Let's Ecrypt 模組申請 TLS 憑證,應該就可以了!

Cloudflare Pseudo IPv4

參考資料