如何搭配证书与密钥正确使用PyAPNs2发送APNs推送通知
PyAPNs2 证书配置正确方案
你遇到的传参失败、合并证书报错问题,核心是证书格式转换步骤缺失,不是合并方案本身错误。以下是可直接复现的操作流程:
前置证书格式转换
苹果直接下载的certificate.cer是DER编码格式,无法直接被PyAPNs2的SSL模块识别,必须先转成标准PEM编码:
- 转换CER证书为PEM格式,执行命令:
openssl x509 -in certificate.cer -inform DER -out apns_cert.pem -outform PEM - 转换私钥为PEM格式,如果你的私钥生成时设置了密码,执行命令时会提示输入密码,完成后输出无加密的PEM私钥:
openssl rsa -in key.key -out apns_key.pem
如果你不想解密私钥,可以跳过这步的解密操作,后续初始化客户端时传入
password="你的私钥密码"参数即可。
两种传参方式
方式1:不合并文件(推荐,避免合并出错)
很多人没注意PyAPNs2的源码参数,APNsClient原生支持分别传入证书、密钥文件路径,不需要强制合并成单个文件,示例代码:
from apns2.client import APNsClient from apns2.payload import Payload client = APNsClient( cert_file="apns_cert.pem", key_file="apns_key.pem", use_sandbox=False, # 沙箱测试环境改为True use_alternative_port=False, # password="你的私钥密码" # 私钥未解密时打开这个注释 ) # 推送调用示例 payload = Payload(alert="推送测试内容", sound="default", badge=1) # topic填你App对应的Bundle ID client.send_notification(device_token="目标设备Token", payload=payload, topic="你的App Bundle ID")
方式2:合并为单个PEM文件
如果你需要用单文件传参的方式,按正确顺序合并两个转换好的PEM文件即可,之前报unable to load certificates是因为你直接合并了原始DER格式的CER和密钥,没有做格式转换:
- 执行合并命令:
cat apns_cert.pem apns_key.pem > apns_combined.pem - 验证合并文件有效性,正式环境执行:
openssl s_client -connect api.push.apple.com:443 -cert apns_combined.pem
沙箱环境执行:openssl s_client -connect api.sandbox.push.apple.com:443 -cert apns_combined.pem
如果命令返回SSL握手成功、没有证书加载错误,说明文件有效,直接传入文件路径初始化即可:
client = APNsClient("apns_combined.pem", use_sandbox=False, use_alternative_port=False)
常见报错排查点
- 证书环境不匹配:沙箱证书只能连沙箱环境,生产证书只能连正式环境,混用会直接握手失败
- 证书过期:检查苹果开发者后台的推送证书是否在有效期内
- 权限问题:确保运行脚本的用户对证书、密钥文件有读取权限
其他优质Python APNs类库推荐
apns2:PyAPNs2的活跃维护分叉版本,修复了旧版本大量HTTP/2、SSL兼容问题,API和PyAPNs2完全一致,迁移零成本aioapns:基于asyncio实现的异步APNs库,支持高并发推送,适合百万级以上推送量级的业务场景pushjack:轻量推送库,同时支持APNs和FCM,兼容证书、Token两种APNs认证方式,代码简洁适合小型项目快速集成
内容的提问来源于stack exchange,提问作者Nazar
相关产品推荐
相关产品推荐

