无法连接到 APNS:返回代码 20(无法获取本地颁发者证书)
Posted
技术标签:
【中文标题】无法连接到 APNS:返回代码 20(无法获取本地颁发者证书)【英文标题】:Cannot connect to APNS: return code 20 (unable to get local issuer certificate) 【发布时间】:2012-08-16 11:40:54 【问题描述】:我正在尝试使用 PyAPNS 将推送通知发送到 iPhone 应用程序。我们已经完成了从 Apple 开发中心获取证书的过程,效果很好;但是,我们遵循了几个不同的教程,了解如何将证书和私钥放在一个 .pem 文件中,并且对于所有这些教程,尝试使用生成的证书从我们的 Web 服务器使用 OpenSSL 连接到 APNS 服务器这个错误:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns.pem
CONNECTED(00000003)
depth=1 C = US, O = "Entrust, Inc.", OU = www.entrust.net/rpa is incorporated by reference, OU = "(c) 2009 Entrust, Inc.", CN = Entrust Certification Authority - L1C
verify error:num=20:unable to get local issuer certificate
verify return:0
[...certificate chain, server certificate, etc.]
有时我们可以在所有这些结束时输入一些东西,并且在我们按下回车之前连接不会关闭,有时不会(它立即关闭),但即使我们看起来有连接,PyAPNS 总是失败当我们尝试发送推送通知时,给出错误“故障 500:'无法连接到 APNS 服务器。'”,我只能假设与“无法获得本地颁发者证书”的原因相同- 虽然我不知道这可能是什么原因。
我们一直关注的教程包括:
http://blog.serverdensity.com/how-to-build-an-apple-push-notification-provider-server-tutorial/
http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
http://www.nasoni.net/2010/12/02/apns-client-development-certificate/
http://thebirdytoldmeso.com/%28S%28l131v3jmvpdh5255u1jayp20%29%29/userActions/thread/Question.aspx?id=10302792
是的,我们一直在从私钥中删除密码,当我们尝试连接 OpenSSL 时它不会要求它,所以大概这部分工作正常。
我们不知道出了什么问题。令人气愤的是,所有这些教程(显然还有 Apple)都假定您使用的是 Mac,而我正在 Windows 上开发,而服务器(我正在开发的服务器)是 Ubuntu;在将结果文件发送给我以上传到服务器并执行最后步骤之前,我在 Mac 上的同事一直在为第一步做各种前缀。莫名其妙地,这与它有关吗?或者是否有一个必要的服务器设置步骤在各处都被省略了?
【问题讨论】:
您是否使用证书导出了密钥?这通常是第一个问题 “verify error:num=20” when connecting to gateway.sandbox.push.apple.com 可能重复。 【参考方案1】:使用来自 raywenderlich.com 的教程中的 simplepush php 脚本测试您的证书,然后我们可以从那里开始。有时看起来证书很好,但苹果对所有这些东西都非常挑剔。
我认为错误 20 表示您的私钥有问题,并且我认为您的配置文件也可能有问题:http://www.raywenderlich.com/forums/viewtopic.php?f=2&t=380&start=100。
确保您正确导出所有内容,如果需要,请撤销并制作新证书。希望你能解决这个问题! :)
【讨论】:
在 raywenderlich.com 的教程中使用 simplepush php 脚本测试证书现在对我来说效果很好。也许你是对的,苹果太挑剔了。我应该继续前进,看看最终结果。【参考方案2】:正如 Ray Wenderlich 所说,您可能需要将其添加到您的 php 文件中:
stream_context_set_option($ctx, 'ssl', 'cafile', 'entrust_2048_ca.cer');
您可以在此处下载的证书颁发机构文件: https://www.entrust.net/downloads/binary/entrust_2048_ca.cer
【讨论】:
以上是关于无法连接到 APNS:返回代码 20(无法获取本地颁发者证书)的主要内容,如果未能解决你的问题,请参考以下文章
突然无法使用 PushSharp 连接到 APNS 沙箱环境
无法使用 Rails、apn_sender gem 连接到 APNS(Apple Push Notifications Server)
VS Code 连接到 WSL Ubuntu 20.04 LTS,失败并出现错误:无法获取远程环境