一些开启Cloudflare始终使用HTTPS时cPanel的AutoSSL申请或续期证书出错的解决方法

发布于2023/08/01更新于2024/7/5

在cPanel上管理站点是比较简单方便的。给站点套上Cloudflare的CDN也是不少站长的选择。然而在使用了Cloudflare的CDN代理且开启了“始终使用HTTPS”(Always Use HTTPS)时,cPanel中的AutoSSL则可能会在申请SSL证书,或是为证书续期时出现错误。此时,本可依靠两个系统自动完成相应功能,而不必手动介入的预期则成了泡影。

注意:这篇日志为我记录与获取方便而发布;内容中有很多处未涉及严格的考究和对选择的充分讨论,代码部分亦有存在纰漏的可能;请酌情参考,小心使用!

经过搜索,遇到这个问题和类似问题的人不在少数[12345]。对于同时使用Cloudflare和cPanel的情况来说,cPanel的AutoSSL依赖ACME服务端进行“HTTP-01验证”来进行SSL证书签发。那么,此类问题中的绝大多数都与在cPanel端的HTTP-01验证有关。

总结来看,在使用了Cloudflare的CDN代理(橘色云图标启用)且开启了“始终使用HTTPS”(Always Use HTTPS)的情况下,被代理站点在cPanel中通过AutoSSL往往会在新申请SSL证书和续期SSL证书遇到问题而失败:

  1. AutoSSL在申请SSL证书失败后,可能会返回类似如下的错误:
    DNS DCV: No local authority: “abc.example.com”; HTTP DCV: The system queried for a temporary file at “http://abc.example.com/.well-known/pki-validation/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.txt/”, which was redirected from “http://abc.example.com/.well-known/pki-validation/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.txt”. The web server responded with the following error: 526 (). A DNS (Domain Name System) or web server misconfiguration may exist. The domain “abc.example.com” resolved to an IP address “104.xxx.yyy.zzz” that does not exist on this server.
    这种情况是在Cloudflare已启用了CDN代理、启用了“始终使用HTTPS”(Always Use HTTPS)并使用的是严格的完全SSL/TLS模式(Full (strict)),在Cloudflare端将HTTP-01的验证连接从HTTP重定向到了HTTPS,而对于ACME客户端来说,也就是在cPanel所在的服务器端因使用的是自签证书而返回HTTP 526错误(HTTP 526 Invalid SSL certificate),无法完成ACME服务端的HTTP-01验证,最后签发证书失败。
  2. AutoSSL在为SSL证书续期失败时,如当前已有的SSL证书仍可用(未过期且已部署),可能会遇到类似如下的错误:
    DNS DCV: No local authority: “abc.example.com”; HTTP DCV: “cPanel (powered by Sectigo)” forbids DCV HTTP redirections
    这种情况是在Cloudflare已启用了CDN代理并启用了“始终使用HTTPS”(Always Use HTTPS)时,在Cloudflare端将HTTP-01的验证连接从HTTP重定向到了HTTPS(对于ACME服务端来说);而由Sectigo为cPanel签发证书不允许HTTP跳转,最后续签证书失败。
  3. AutoSSL在为SSL证书续期失败时,如当前已有的SSL证书已过期,返回的错误可能如下:
    DNS DCV: No local authority: “abc.example.com”; HTTP DCV: The system queried for a temporary file at “http://abc.example.com/.well-known/pki-validation/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.txt/”, which was redirected from “http://abc.example.com/.well-known/pki-validation/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.txt”. The web server responded with the following error: 526 (). A DNS (Domain Name System) or web server misconfiguration may exist. The domain “abc.example.com” resolved to an IP address “104.xxx.yyy.zzz” that does not exist on this server.
    这种情况是在Cloudflare已启用了CDN代理、启用了“始终使用HTTPS”(Always Use HTTPS)并使用的是严格的完全SSL/TLS模式(Full (strict)),在Cloudflare端将HTTP-01的验证连接从HTTP重定向到了HTTPS,对于ACME客户端来说,也就是在cPanel所在的服务器端因证书过期而返回HTTP 526错误(HTTP 526 Invalid SSL certificate),无法完成ACME服务端的HTTP-01验证,最后续签证书失败。

这些问题的解决办法一般都是建议在执行AutoSSL时临时关闭Cloudflare的CDN代理,等到SSL证书签发后再重新打开;或是取消“总是使用HTTPS”(Always Use HTTPS)选项设置,而在cPanel所在服务器上设置重定向到HTTPS。这是个有用的办法,但感觉不那么友好。

Cloudflare在最近几年加入了许多新的功能和设置。其中的“规则”(Rules)类中在单一的“页面规则”(Page Rules)之外添加了“配置规则”(Configuration Rules)、“转换规则”(Transform Rules)、“重定向规则”(Redirect Rules)和“源规则”(Origin Rules)。而利用“重定向规则”(Redirect Rules)则刚好可以解决上面的问题。

简而言之,在希望使用几乎全程HTTPS的情况下,解决以上问题的方法是:

  1. 在Cloudflare中关闭“始终使用HTTPS”(Always Use HTTPS)。
  2. 利用Cloudflare的“重定向规则”(Redirect Rules)对cPanel申请签发SSL证书的HTTP-01验证的链接保持HTTP协议,而对除此之外的其它链接重定向为HTTPS协议。

在Cloudflare中关闭“始终使用HTTPS”(Always Use HTTPS)后,对于域名abc.example.com而言,在“重定向规则”(Redirect Rules)新增一条规则,其中请求来源的Custom filter expression为:

not (
    (
        (
            http.host eq "abc.example.com"
        )
        and 
        (
            starts_with(http.request.uri, "/.well-known/cpanel-dcv/") 
            or
            starts_with(http.request.uri, "/.well-known/pki-validation/")
        )
    )
)
and
not ssl 

URL redirect设置为Dynamic,表达式为concat("https://", http.host, http.request.uri),状态代码为301,然后保存并启用即可。

如果还需要对于域名xyz.example.com和域名opq.example.com为Let’s Encrypt的SSL证书签发HTTP-01验证链接进行设置,且域名123.example.com也部署在cPanel所在的服务器上,则请求来源的Custom filter expression可以这么写:

not (
    (
        (
            http.host eq "xyz.example.com"
            or
            http.host eq "opq.example.com"
        )
        and 
        (
            starts_with(http.request.uri, "/.well-known/acme-challenge/")
        )
    )
    or
    (
        (
            http.host eq "abc.example.com"
            or
            http.host eq "123.example.com"
        )
        and 
        (
            starts_with(http.request.uri, "/.well-known/cpanel-dcv/") 
            or
            starts_with(http.request.uri, "/.well-known/pki-validation/")
        )
    )
)
and
not ssl 

然后设置同样的URL重定向保存后启用即可。

Leave a Reply

Your email address will not be published. Required fields are marked *