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'
将更新后的Gemfile、Gemfile.lock提交到代码仓库,重新部署Heroku环境即可,本地和线上的报错会直接消失。bundle update apnotic net-http2 - 临时兼容方案(无法升级大版本时使用)
如果受项目其他依赖限制暂时没法升级Apnotic,可以在初始化Apnotic连接时手动指定系统可信CA证书路径,跳过gem内置的过期证书文件:
这个配置在本地macOS/Linux环境、Heroku部署环境均通用,不需要额外修改系统配置。@ios_client = Apnotic::Connection.new( cert_path: Rails.root.join("config", "certs", "apns_push.pem"), # 替换成你自己的推送证书路径 # 手动指定系统CA证书路径 ssl_ca_file: OpenSSL::X509::DEFAULT_CERT_FILE ) - 验证方法
配置完成后直接执行原有@ios_client.push(note)逻辑测试,只要不再抛出OpenSSL::SSL::SSLError即修复生效,推送功能会恢复正常。
内容的提问来源于stack exchange,提问作者Mikhail Janowski
相关产品推荐
相关产品推荐

