Python SSL wrap_socket失败,SSLError,Errno 336265218

时间:2012-10-09 07:35:23

标签: python ssl

我有简单的客户端/服务器SSL代码,在Python 3.2上运行良好。但是,我决定切换到2.7(由于第三方模块丰富),现在代码失败了。代码如下:

客户端:

def connect(self):
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.connect(('localhost', 4430))
    self.ssl_sock = ssl.wrap_socket(self.sock, cert_reqs = ssl.CERT_NONE, ssl_version = ssl.PROTOCOL_TLSv1)

服务器:

self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.sock.bind((self.hostname, 4430))
    self.sock.listen(5)
    while True:
        self.newsocket, self.fromaddr = self.sock.accept()
        self.ssl_sock = ssl.wrap_socket(
                            self.newsocket, 
                            server_side = True,
                            certfile = "cert.pem",
                            ssl_version=ssl.PROTOCOL_TLSv1
        ) 

        self._handle_client(self.ssl_sock)

cert.pem(与server .py文件位于同一目录中):

-----BEGIN RSA PRIVATE KEY-----
(812 "random" characters here)
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(1260 "random" characters here)
-----END CERTIFICATE-----

失败如下:
1.服务器等待self.sock.accept()
2.客户端与self.sock.connect()连接 3.服务器进入wrap_socket,失败并出现以下错误:

Traceback (most recent call last):
  File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
    self.run()
  File "C:\workspace\projectc\server\server\clientlistener.py", line 49, in run
    ssl_version=ssl.PROTOCOL_TLSv1
  File "C:\Program Files\Python27\lib\ssl.py", line 381, in wrap_socket
    ciphers=ciphers)
  File "C:\Program Files\Python27\lib\ssl.py", line 141, in __init__
    ciphers)
SSLError: [Errno 336265218] _ssl.c:351: error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib

P.S。
1)我对wrap_socket调用有所怀疑,因为即使我对certfile使用不存在的文件,也会产生相同的错误。
2)我尝试在ssl上的python文档中使用替代包装(即使用ssl.SSLContext),并且奇怪的是'module'对象没有属性'SSLContext',当它是ssl模块的一部分时。当我用Python 3.2尝试它时,这不是问题。

更新:
我发现问题只发生在我从Eclipse中“运行”时,而不是当我从单独的命令提示中运行这两个文件时。还在调查这个问题......

更新2: 我尝试了一个非常简单的客户端/服务器脚本与SAME代码,它的工作原理。现在,由于服务器代码位于多处理子进程(由主服务器进程启动)内,它似乎无法工作。有关?

2 个答案:

答案 0 :(得分:3)

问题解决了。我相信Eclipse持有一些剩余信息,但我从来没有弄清楚它持有什么信息。它可能与从python 3.2到2.7的迁移有关,尽管我之前已经在运行配置中对其进行了更改。重置Eclipse环境有效(仅重新启动计算机是不够的)。

答案 1 :(得分:2)

我的解决方案是,在创建我的.pem文件时,我设置了一个空密码并假设它没有密码。所以服务器仍然希望使用密码。我不得不手动删除密码。

这里有一点如何引导,如果它可以帮助任何人(另外,请注意我正在为服务器端编写python到iOS应用程序)

注意:需要按照Apple开发者网站的说明首先创建证书  然后导出.p12文件,  通过导出创建的嵌入式私钥(在'keychain access'中),  不是实际的证书 ------------------------------------ ------------------------------------ FOR DEVELOPMENT CERT: 获取p12文件后,需要通过终端执行此命令将其转换为PEM格式: $ openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns_dev.p12 $ openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns_dev.p12

如果您想删除密码,请执行以下操作:    (注意:导出/转换时使用'空白'密码,仍然确实设置了密码,      因此,如果您打算没有密码,您仍应执行以下操作) $ openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem

最后,您需要将密钥和证书文件合并到我们将在连接到APNS时使用的apns-dev.pem文件中:

$ cat apns-dev-cert.pem apns-dev-key-noenc.pem> APNS-dev.pem

------------------------------------ 生产CERT: 获取p12文件后,需要通过终端执行此命令将其转换为PEM格式: $ openssl pkcs12 -clcerts -nokeys -out apns-prod-cert.pem -in apns_prod.p12 $ openssl pkcs12 -nocerts -out apns-prod-key.pem -in apns_prod.p12

如果您想删除密码,请执行以下操作:    (注意:导出/转换时使用'空白'密码,仍然确实设置了密码,      因此,如果您打算没有密码,您仍应执行以下操作) $ openssl rsa -in apns-prod-key.pem -out apns-prod-key-noenc.pem

最后,您需要将密钥和证书文件合并到我们将在连接到APNS时使用的apns-dev.pem文件中:

$ cat apns-prod-cert.pem apns-prod-key-noenc.pem> apns-prod.pem