寻找验证APNS证书文件是否有效的替代方法?

4
我在开发一个APNS的"提供者"时遇到了问题。我的服务器正在尝试使用apns-client发送消息,似乎在发送消息时没有出现任何问题,但设备根本没有收到任何消息。
最近,我已经将*.pem文件更改为新文件。在使用旧的*.pem文件时,消息可以正常接收,因此我确信服务器连接和发送脚本(用Python编写)没有问题。原因可能是因为旧的*.pem文件是有效的,而新的*.pem文件无效。
我强烈希望从APNS服务器得到一个“错误”响应,如果*.pem文件无效,但似乎APNS服务器或apns-client库即使*.pem文件无效也没有返回任何错误信号。我已通过在*.pem中的 -----END RSA PRIVATE KEY----- 之前添加一百个'a'字符,并运行相同的Python脚本来证明这一事实。是的,它仍然没有收到任何错误消息。
由于APNS服务器没有返回任何错误消息,几乎不可能检查*.pem文件是否有效...难道没有检查*.pem文件是否有效的方法吗?

当我生成证书时,它会要求我输入一些密钥,这些密钥在我从密钥链中导出时指定。当我启动应用程序时,它会在控制台中要求我输入密钥,我确信我的证书已经正确加载,然后我只需删除此密钥即可。我注意到的另一件事是,如果您删除了供应配置文件,则不会打印任何内容。 - Slow Harry
3个回答

5

以下是Apple提供的一些故障排除信息:

连接推送服务出现问题

可能的原因是您的服务器无法连接到推送服务。这可能意味着您没有用于TLS/SSL验证与服务的连接所需的证书链。除了会员中心创建的SSL身份(证书和相关私钥)之外,您还应该在提供程序上安装Entrust CA(2048)根证书。这允许TLS/SSL验证完整的APNs服务器证书链。如果您需要获取此根证书,可以从Entrust的网站下载。还要验证这些身份是否已安装在适合您提供程序的正确位置,并且您的提供程序具有读取它们的权限。

您可以使用OpenSSL s_client命令测试TLS/SSL握手,例如:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert YourSSLCertAndPrivateKey.pem -debug -showcerts -CAfile server-ca-cert.pem

其中server-ca-cert.pem是Entrust CA(2048)根证书。

确保SSL身份和主机名是您正在测试的推送环境的正确身份。您可以在会员中心单独为沙盒和生产环境配置App ID,并为每个环境发行单独的身份。

尝试使用沙盒SSL身份连接到生产环境将返回以下错误:

CRITICAL | 14:48:40.304061 | Exception creating ssl connection to Apple: [Errno 1] _ssl.c:480: error:14094414:SSL routines:SSL3_READ_BYTES:sslv3 alert certificate revoked


Entrust CA (2048)已经存在,但在证书链中我可以看到一条消息:“找不到此证书的颁发者。”而不是“此证书无问题”。 - Rashmin Javiya

3
为了测试你的生产证书,打开终端并执行以下操作:
openssl s_client -connect gateway.push.apple.com:2195 -cert PushProdCer.pem -key PushProdKey.pem

2
我不熟悉你正在使用的Python客户端,但肯定有一种方法可以尝试连接到Apple的PNS服务器并检测连接是否失败。如果连接失败,则PEM文件存在问题-可能是格式或证书值本身的问题。
如果您想获得比“通过或失败”更具说明性的错误消息,我建议您查看一些第三方shell脚本,它们可以返回有关PEM文件的基本信息。此线程包含一些示例脚本。
当然,您也可以检查广泛可用的一些基本格式验证。我在这里提供了一个示例,但还有其他选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接