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

Rails使用Apnotic推送APNs报OpenSSL证书过期错误排查

问题根因

这个SSL_read: sslv3 alert certificate expired报错和你自行生成的Apple推送证书、本地/Heroku环境的OpenSSL配置均无关,是Apnotic依赖的底层HTTP/2库net-http2旧版本内置的过期根证书导致的。
Apple Push Notification service在2021年完成了根证书切换,旧版GeoTrust Global CA根证书已到期,所有0.19.0以下版本的net-http2都内置了这份过期的根证书文件,连接APNs做TLS握手校验服务端证书链时,就会直接抛出证书过期错误,无论你重新生成多少次业务推送证书都无法解决。

修复步骤
  • 优先升级依赖(无侵入、最稳定)
    Apnotic从1.6.0版本开始已经适配了修复根证书问题的新版net-http2,不需要修改任何推送业务代码。直接在项目Gemfile中指定Apnotic版本:
    gem 'apnotic', '~> 1.7'
    
    本地执行命令更新依赖:
    bundle update apnotic net-http2
    
    将更新后的Gemfile、Gemfile.lock提交到代码仓库,重新部署Heroku环境即可,本地和线上的报错会直接消失。
  • 临时兼容方案(无法升级大版本时使用)
    如果受项目其他依赖限制暂时没法升级Apnotic,可以在初始化Apnotic连接时手动指定系统可信CA证书路径,跳过gem内置的过期证书文件:
    @ios_client = Apnotic::Connection.new(
      cert_path: Rails.root.join("config", "certs", "apns_push.pem"), # 替换成你自己的推送证书路径
      # 手动指定系统CA证书路径
      ssl_ca_file: OpenSSL::X509::DEFAULT_CERT_FILE
    )
    
    这个配置在本地macOS/Linux环境、Heroku部署环境均通用,不需要额外修改系统配置。
  • 验证方法
    配置完成后直接执行原有@ios_client.push(note)逻辑测试,只要不再抛出OpenSSL::SSL::SSLError即修复生效,推送功能会恢复正常。

内容的提问来源于stack exchange,提问作者Mikhail Janowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:18:49