我正在尝试使用 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 错误的信息。这是整个错误回溯:
文件“Usinghttplib_Test.py”,第 175 行,在 t.connect(cert_file=opts["-keys"], host=host_name, usrname=opts["-username"], passwd=opts["-password"]) 文件“Usinghttplib_Test.py”,第 40 行,在连接中 self.conn.endheaders() 文件“c:\python26\lib\httplib.py”,第 904 行,在 endheaders self._send_output() _send_output 中的文件“c:\python26\lib\httplib.py”,第 776 行 自我发送(味精) 文件“c:\python26\lib\httplib.py”,第 735 行,在发送中 self.connect() 文件“c:\python26\lib\httplib.py”,第 1112 行,在连接中 self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file) wrap_socket 中的文件“c:\python26\lib\ssl.py”,第 350 行 suppress_ragged_eofs=suppress_ragged_eofs) 文件“c:\python26\lib\ssl.py”,第 113 行,在 __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 证书。
为了好玩,我将 PKCS#12 证书转换为 PEM 证书,并使用该. 在这种情况下,我没有收到任何错误,系统提示我输入 PEM 密码,并且代码确实尝试访问服务器。(我收到响应“服务不可用。请稍后再试。”,但我相信那是因为服务器不接受 PEM 证书。我也无法在 Firefox 中使用 PEM 证书连接到服务器.)
httplib 的 HTTPSConnection 是否应该支持 PCKS#12 证书?(即 pfx 文件。)如果是这样,为什么看起来 openSSL 正试图将其加载到 PEM 库中?我做这一切都错了吗?
欢迎任何建议。
编辑:证书文件包含证书和私钥,这就是为什么我为 HTTPSConnection 的 key_file 和 cert_file 参数提供相同的文件名的原因。