You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloudflare子域名访问自定义端口API报525 SSL握手失败

问题核心原因

Cloudflare返回525 SSL握手失败的本质是端口协议配置不匹配:

  • 2083是Cloudflare规则里默认的HTTPS回源端口,只要请求发往这个端口,Cloudflare边缘节点会强制和源站发起TLS握手,不会跟随你设置的Flexible SSL模式降级为HTTP请求
  • 你当前Apache上2083端口的虚拟主机只配置了纯HTTP服务,没有加载SSL模块、也没有配置证书,根本无法响应TLS握手请求
  • 直接用IP+2083能正常访问,是因为浏览器默认对带非443端口的IP地址发起HTTP请求,没有走SSL握手流程,所以不会触发错误;80端口的Next.js服务正常,是因为80属于Cloudflare默认的HTTP回源端口,Flexible模式下会直接发HTTP请求到源站,能正常匹配你现有的反向代理规则。
解决方案

优先选第一种架构调整方案,安全性和稳定性最高:

方案一:统一走标准443端口(生产环境推荐)

不要对外暴露2083、3000这类业务端口,所有流量统一走443 HTTPS端口,由Apache按路径分发请求:

  1. 先去Cloudflare控制台的「源服务器」板块,签发免费的Cloudflare源站证书,有效期选最长15年即可,把证书和私钥文件传到服务器的/etc/apache2/ssl/目录下(目录不存在可自行创建)
  2. 开启Apache必要模块,执行以下命令:
    a2enmod ssl proxy proxy_http rewrite
    systemctl restart apache2
    
  3. 修改ports.conf,删掉2083端口的公网监听配置,只保留标准端口监听:
    Listen 80
    <IfModule ssl_module>
        Listen 443
    </IfModule>
    <IfModule mod_gnutls.c>
        Listen 443
    </IfModule>
    
  4. 新建443端口的虚拟主机配置,统一处理域名的所有请求,按路径分发到前后端服务:
    <VirtualHost *:443>
        ServerName example.domain.com
        # 配置SSL证书
        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/cloudflare_cert.pem
        SSLCertificateKeyFile /etc/apache2/ssl/cloudflare_key.pem
    
        # 先配置Laravel API路由,所有/api前缀的请求交给Laravel处理
        Alias /api /var/www/laravel-project/public
        <Directory /var/www/laravel-project/public>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    
        # 剩下的所有请求交给Next.js处理
        ProxyPreserveHost On
        ProxyPass /api !
        ProxyPass / http://127.0.0.1:3000/
        ProxyPassReverse / http://127.0.0.1:3000/
    
        ErrorLog ${APACHE_LOG_DIR}/laravel_next_ssl_error.log
        CustomLog ${APACHE_LOG_DIR}/laravel_next_ssl_access.log combined
    </VirtualHost>
    
    # 80端口的虚拟主机全部跳转到HTTPS
    <VirtualHost *:80>
        ServerName example.domain.com
        RewriteEngine On
        RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
    </VirtualHost>
    
  5. 删掉原来单独监听2083、80端口反代3000的旧虚拟主机配置,执行apache2ctl configtest确认配置无语法错误,然后systemctl reload apache2重载配置
  6. 回到Cloudflare控制台,把SSL/TLS加密模式改成完全(严格),不需要单独给端口加规则,所有请求走443端口即可正常访问,API和前端都不会报错。同时记得把防火墙里2083、3000端口的公网放行规则删掉,避免业务端口直接暴露在公网被扫描攻击。

方案二:保留2083端口对外提供服务(仅临时测试用,不推荐生产环境)

如果必须用2083端口访问API,需要给该端口配置SSL支持,或者强制Cloudflare对该端口走HTTP回源:

  1. 给2083端口的虚拟主机加上SSL配置,和443端口的配置一致,加上SSLEngine on和对应证书路径,同时修改ports.conf里的2083监听规则为Listen 2083 https
  2. 如果不想给2083配证书,就去Cloudflare的页面规则里新建一条规则,匹配路径为*://example.domain.com:2083/*,规则项里把SSL模式设置为「关」,强制Cloudflare访问2083时走HTTP协议,同时关闭「Always Use HTTPS」对该端口的跳转。注意这种方式下Cloudflare到源站的2083流量是明文传输,存在被窃听篡改的风险。
快速排查验证步骤
  • 服务器本地执行curl -I http://127.0.0.1:2083,确认返回200状态码,Laravel服务本身运行正常
  • 服务器本地执行curl -Iv https://example.domain.com:2083,如果返回SSL握手失败、连接重置,就说明源站2083端口没有配置SSL服务
  • 去Cloudflare控制台的「事件日志」里筛选525错误,可以看到具体的握手失败原因,比如证书无效、源站无TLS响应等。

内容的提问来源于stack exchange,提问作者fahad shaikh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:27:17