我正在尝试展示如何从Google App Engine应用程序实例使用此RPC处理程序发送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派生)和设备令牌,有关验证这些内容的建议将非常有用。目前我相信它们是当前和有效的。
虽然正在指定TLSv1协议,但我注意到握手失败标识sslv3。
我尝试了许多wrap_socket和apns_address的变化和组合,并且一直被握手失败所阻止。这让我怀疑我应用pem证书的方式存在问题。
我主要参考wrap_socket的文献是使用OpenSSL和用于套接字对象的TLS / SSL包装器,更不用说StackOverflow上的许多帖子了。
请提供有关GAE基于APNs通信的适当keyfile、certfile和ca_certs值以及任何其他可用资源或建议。谢谢~
更新问题...
使用Pusher验证了原始的.p12,并通过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),则会返回到原始的握手失败状态。