Python中SSLSocket的密码短语/密码

5
最近我一直在研究为我的一个应用制作iOS推送通知服务。由于它有一个Python 2.7后端,所以我想用Python而不是PHP(或其他任何语言)来完成这项工作。
我已经编写了发送通知并且设备可以接收到的代码。但是每次运行程序时,它都会要求我手动输入PEM文件的“密码短语”。
这不是很理想,因为我希望在服务器上自动化该过程,当需要发送通知时,服务器应该只需发送即可。我无法在Python 2.7文档中找到允许我在连接时从变量自动设置密码短语的方法。
如果有人知道如何在Python 2.7中解决此问题,或者有其他想法,我将非常感激。
以下是代码片段:
certfile = 'devPEM.pem'
apns_address = ('gateway.sandbox.push.apple.com', 2195)

s = socket.socket()
sock = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv3, certfile=certfile)
sock.connect(apns_address)

感谢您的提前帮助。

当您生成 .pem 证书时,是否设置了密码?如果是的话,那可能就是它询问您的内容。 - Savir
@BorrajaX 是的,我已经知道密码是什么了。你应该能够创建没有密码的.pem文件,因为我认为如果没有密码它不会让我创建它? - Baza207
是的,我不知道在iOS中如何操作,但你应该能够提供一个空密码(当提示输入密码时,只需按回车键即可)。如果可以的话,请告诉我 :-) - Savir
我已经删除了密码,但仍然出现以下错误: SSLError: [Errno 336445449] _ssl.c:353: error:140DC009:SSL routines:SSL_CTX_use_certificate_chain_file:PEM lib 如何解决这个问题? - Mohini
以上错误是在Python2.6中出现的。此外,我在Python2.7.9中也遇到了以下错误: 文件"E:\ Python27 \ push.py",第41行,在<module>中 send_push(TOKEN,json.dumps(PAYLOAD)) 文件"E:\ Python27 \ push.py",第28行,在send_push中 sock = ssl.wrap_socket(s,ssl_version = ssl.PROTOCOL_SSLv3,certfile = cert) 文件"E:\ Python27 \ lib \ ssl.py",第891行,在wrap_socket中 ciphers = ciphers) 文件"E:\ Python27 \ lib \ ssl.py",第509行,在__init__中 self._context.load_cert_chain(certfile,keyfile) SSLError:[SSL] PEM库(_ssl.c:2506) - Mohini
显示剩余2条评论
1个回答

18

正如BorrajaX所建议的那样,答案是不要在提示时为密钥设置密码。但是这是不可能的(至少在我的Mac上),因为它需要密码至少4个字符。

修复此问题的步骤如下:

  1. 在开发者门户中创建证书。
  2. 从Keychain Access下载并打开证书。
  3. 从Keychain Access作为.p12文件导出证书的私钥(我将其命名为aps_key.p12)。
  4. 运行以下命令以处理.p12密钥:
    openssl pkcs12 -nocerts -out aps_key.pem -in aps_key.p12
  5. 输入密码(稍后我们将删除)。
  6. 运行以下命令以去除密码:
    openssl rsa -in aps_key.pem -out new_aps_key.pem
  7. 将从Developer Center下载的.cer转换为.pem文件:
    openssl x509 -in aps.cer -inform der -out aps.pem
  8. 使用以下方式合并.key和证书.pem文件:
    cat aps.pem new_aps_key.pem > final_aps.pem
  9. 现在可以删除所有其他文件,仅保留final_aps.pem

然后使用上面的代码而不被提示输入密码/密码短语,final_aps.pem文件就能发挥作用。

这是我找到的一个有用的网站,可以从中找到删除.pem文件密码的代码:http://www.sslshopper.com/article-most-common-openssl-commands.html

编辑:如果您不需要证书和密钥在同一个文件中,请忽略第8步,并使用aps.pemnew_aps_key.pem文件。


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