我正在尝试使用此RPC处理程序显示来自Google AppEngine应用程序实例的iOS推送通知的概念证明...

PAYLOAD = {'aps': {'alert':'Push!','sound':'default'}}
TOKEN = '[...]'


class APNsTest(BaseRPCHandler):

  def get(self, context, name):
    self._call_method(context, name)

  def send_push(self):

    # certificate files
    filename = 'VisitorGuidePush'
    abs_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../archive/certificate'))
    ca_certs = os.path.abspath(os.path.join(abs_path, '%s.ca'%filename))
    certfile = os.path.abspath(os.path.join(abs_path, '%s.crt'%filename))
    keyfile = os.path.abspath(os.path.join(abs_path, '%s.key'%filename))

    # serialize payload
    payload = json.dumps(PAYLOAD)

    # APNS server address...
    # apns_address = ('api.development.push.apple.com', 443) # Development server
    # apns_address = ('api.development.push.apple.com', 2197) # Development server
    # apns_address = ('api.push.apple.com', 443) # Production server
    apns_address = ('api.push.apple.com', 2197) # Production server

    # a socket to connect to APNS over SSL
    _sock = socket.socket()
    _ssl = ssl.wrap_socket(_sock, keyfile=keyfile,
                                  certfile=certfile,
                                  server_side=False,
                                  cert_reqs=ssl.CERT_REQUIRED,
                                  ssl_version=ssl.PROTOCOL_TLSv1,
                                  ca_certs=ca_certs)
    _ssl.connect(apns_address)

    # Generate a notification packet
    token = binascii.unhexlify(TOKEN)
    fmt = '!cH32sH{0:d}s'.format(len(payload))
    cmd = '\x00'
    message = struct.pack(fmt, cmd, len(token), token, len(payload), payload)

    _ssl.write(message)
    _ssl.close()

    return self.response_result(PAYLOAD)

并且在执行“_ssl.connect(apns_address)”时需要帮助解决此错误
SSLError: [Errno 1] _ssl.c:507: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
我的PEM文件(来自.p12)和设备 token 是由我们团队中的移动开发人员一周前生成的,有关验证这些文件的建议会有所帮助。到目前为止,我相信这里是有效的。

在指定TLSv1协议(protocol)的同时,我注意到握手失败标识了sslv3。

我已经尝试了wrap_socket和apns_address的许多变体和组合,并且始终因握手失败而停止。这使我怀疑我申请pem证书的方式有问题。

我一直用于wrap_socket的主要引用是Using OpenSSLTLS/SSL wrapper for socket objects,更不用说一些StackOverflow帖子了。



更新的问题...

原始.p12已使用Pusher进行了验证,并通过openssl进行了分割...
openssl pkcs12 -in vgp.p12 -out VisitorGuidePush.key -nodes -nocerts
openssl pkcs12 -in vgp.p12 -out VisitorGuidePush.crt -nodes -nokeys
openssl pkcs12 -in vgp.p12 -out VisitorGuidePush.ca -nodes -cacerts

我收到与ca_certs相关的新错误...
SSLError: [Errno 0] _ssl.c:343: error:00000000:lib(0):func(0):reason(0)
删除ca_certs要求或传入其他文件(如.p12或.crt)会导致返回原始握手失败。

最佳答案

研究使用pyapns之类的库,这是我用来获取推送通知以在GAE上运行的库。要测试您是否使用了正确的 key /证书文件,可以使用Pusher之类的应用程序。另外,我知道要在GAE上获得SSL功能,您必须启用计费功能,所以也许就是问题所在。祝你好运!

关于python - 通过GAE的iOS推送通知(APN),SSL握手失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37892165/

10-10 07:26