我正在尝试使用httplib的HTTPSConnection进行客户端验证,使用PKCS#12证书。我知道证书很好,因为我可以在MSIE和Firefox中使用它连接到服务器。
这是我的连接函数(证书包括私钥)。我把它简化为基本的:
def connect(self, cert_file, host, usrname, passwd):
self.cert_file = cert_file
self.host = host
self.conn = httplib.HTTPSConnection(host=self.host, port=self.port, key_file=cert_file, cert_file=cert_file)
self.conn.putrequest('GET', 'pathnet/,DanaInfo=200.222.1.1+')
self.conn.endheaders()
retCreateCon = self.conn.getresponse()
if is_verbose:
print "Create HTTPS connection, " + retCreateCon.read()
(注意:请不要对硬编码路径发表任何评论-我正试图让它先工作;我会让它变得漂亮。硬编码路径是正确的,因为我在MSIE和Firefox中连接到它。我更改了邮件的IP地址。)
当我试图使用PKCS#12证书(一个.pfx文件)运行这个程序时,我得到了一个看起来是openSSL错误的结果。以下是整个错误回溯:
File "Usinghttplib_Test.py", line 175, in t.connect(cert_file=opts["-keys"], host=host_name, usrname=opts["-username"], passwd=opts["-password"]) File "Usinghttplib_Test.py", line 40, in connect self.conn.endheaders() File "c:\python26\lib\httplib.py", line 904, in endheaders self._send_output() File "c:\python26\lib\httplib.py", line 776, in _send_output self.send(msg) File "c:\python26\lib\httplib.py", line 735, in send self.connect() File "c:\python26\lib\httplib.py", line 1112, in connect self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) File "c:\python26\lib\ssl.py", line 350, in wrap_socket suppress_ragged_eofs=suppress_ragged_eofs) File "c:\python26\lib\ssl.py", line 113, in __init__ cert_reqs, ssl_version, ca_certs) ssl.SSLError: [Errno 336265225] _ssl.c:337: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib
注意,openSSL错误(列表中的最后一个条目)注意到了“PEM lib”,我发现这很奇怪,因为我不想使用PEM证书。
对于kicks,我将PKCS#12 cert转换为PEM cert,并使用和运行相同的代码。在这种情况下,我没有收到错误,我被提示输入PEM密码短语,代码确实试图到达服务器。(我收到的回复是“服务不是 可用。请稍后再试。”,但我认为这可能是因为服务器不接受PEM证书。我也无法在Firefox中使用PEM证书连接到服务器。)
httplib的HTTPSConnection应该支持PCKS#12证书吗?(即pfx文件)如果是,为什么openSSL会试图将其加载到PEM库中?我做错了吗?
欢迎任何建议。
编辑:证书文件包含证书和私钥,这就是为什么我为HTTPSConnection的key_file和cert_file参数提供相同的文件名。
目前没有回答
相关问题 更多 >
编程相关推荐