使用httlib的HTTPSConnection与PKCS#12 certifi连接时出错

2024-04-26 23:00:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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参数提供相同的文件名。


Tags: inpyselfhostsslcertlibconnect