使用PyAPNS发送推送消息时出现ssl.SSLError

0 投票
1 回答
1971 浏览
提问于 2025-04-18 05:19

我一直在尝试访问APNS,以便向我开发的iOS应用发送推送通知。我已经在苹果开发者中心创建了开发和生产证书请求,并进行了签名:

我的证书

这里输入图片描述

对于每个证书(生产和开发),我有三个文件:

  1. aps_development.cer:这是我从苹果下载的一个证书文件,是在签名证书请求后获得的。
  2. dev.pem:这是一个来自OSX钥匙串的.pem公钥文件。
  3. dev.p12:这是一个来自OSX钥匙串的.p12私钥文件,带有密码(还有dev_nopass.p12:这是一个不带密码的.p12私钥文件)。

我尝试过的

  1. 从GitHub克隆并安装了PyAPNs(PyPi版本似乎有点旧,导致导入错误)。
  2. 调整了示例代码为:

from apns import APNs, Frame, Payload

p12 = '/path/to/dev.p12'
p12_nopass = '/path/to/dev_nopass.p12'
pem = '/path/to/dev.pem'
cer = '/path/to/aps_development.cer'

apns = APNs(use_sandbox=True,
            cert_file=pem,
            key_file=p12_nopass)

# Send a notification
# Dummy token, but it does not cause the error (SSL fails before token check)
token_hex = 'b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b87'
payload = Payload(alert="Hello World!", sound="default", badge=1)
apns.gateway_server.send_notification(token_hex, payload)

结果:

Traceback (most recent call last):
  File "apple_push_driver.py", line 18, in <module>
    apns.gateway_server.send_notification(token_hex, payload)
  File "/path_to/site-packages/apns.py", line 381, in send_notification
    self.write(self._get_notification(token_hex, payload))
  File "/path_to/apns.py", line 174, in write
    return self._connection().write(string)
  File "/path_to/apns.py", line 167, in _connection
    self._connect()
  File "/path_to/apns.py", line 151, in _connect
    self._ssl = wrap_socket(self._socket, self.key_file, self.cert_file)
  File "/path_to/ssl.py", line 387, in wrap_socket
    ciphers=ciphers)
  File "/path_to/ssl.py", line 141, in __init__
    ciphers)
ssl.SSLError: [Errno 336265225] _ssl.c:351: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

我尝试了p12p12_nopass,还有生产和开发的证书,结果都是一样的。

有没有人知道为什么我无法建立SSL连接以通过PyAPNs发送推送通知?

1 个回答

0

问题出在使用了原始的 .p12.cer 文件。这些文件应该转换成 pem 格式,可以按照这里的详细说明进行操作:这里

撰写回答