【问题标题】:Error using httlib's HTTPSConnection with PKCS#12 certificate将 httlib 的 HTTPSConnection 与 PKCS#12 证书一起使用时出错
【发布时间】:2011-02-07 11:17:44
【问题描述】:

我正在尝试使用 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()

(注意:请不要在硬编码路径上使用 cmets - 我正在尝试先让它工作;我会在之后让它变得漂亮。硬编码路径是正确的,因为我连接到它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 证书,并使用 that 运行相同的代码。在这种情况下,我没有收到任何错误,提示我输入 PEM 密码,并且代码确实尝试访问服务器。 (我收到回复“服务不 可用的。请稍后再试。”,但我认为这是因为服务器不接受 PEM 证书。我也无法在 Firefox 中使用 PEM 证书连接到服务器。)

httplib 的 HTTPSConnection 是否应该支持 PCKS#12 证书? (即 pfx 文件。)如果是这样,为什么看起来 openSSL 正在尝试将其加载到 PEM 库中?我做错了吗?

欢迎任何建议。

编辑:证书文件包含证书和私钥,这就是我为 HTTPSConnection 的 key_file 和 cert_file 参数提供相同文件名的原因。

【问题讨论】:

    标签: python authentication certificate httplib pkcs#12


    【解决方案1】:

    这并不奇怪。 Python 库参考文档对此非常清楚。来自http://docs.python.org/library/httplib.html

    class httplib.HTTPSConnection(host[, port[, key_file[, cert_file[, strict[, timeout[, source_address]]]]]])

    HTTPConnection 的一个子类,它使用 SSL 与安全服务器进行通信。默认端口为 443。key_file 是包含您的私钥的 PEM 格式 文件的名称。 cert_file 是 PEM 格式 证书链文件。

    【讨论】:

    • +1 用于 RTFM。去年我做这个的时候你在哪里? :)
    • 嗨,雷米,我的速度有点慢 ;-) - 我对 SO 还很陌生。刚刚发现你的帖子搜索了一个类似的错误字符串。原来我只是在调用链的某个地方破坏了参数顺序,并且从未将密钥路径传递给 httplib。
    【解决方案2】:

    在 openSSL 邮件列表中,我与 Mounir Idrassi 聊天。他指出,openSSL 确实支持 PKCS#12 文件,并且 - 根据我收到的错误消息 - httplib 似乎调用了错误的函数来加载密钥。

    用他的话来说:

    关于您遇到的错误,您正在使用的 phython 模块似乎正在调用 SSL_CTX_use_PrivateKey_file,方法是为其提供 PKCS#12 文件名。这不是因为 SSL_CTX_use_PrivateKey_file 只接受两种格式:SSL_FILETYPE_PEM 和 SSL_FILETYPE_ASN1。

    (我给 httplib PKCS#12 文件名作为密钥文件,因为这种文件格式在同一个文件中包含证书和私钥。)

    为了纠正这个问题,您有两种解决方案: - 使用 PEM 文件中的私钥提供 python 模块。 - 或者修改这个 python 模块的源代码,使用我上面提到的 PKCS#12 函数将私钥提取为 EVP_PKEY,然后调用 SSL_use_PrivateKey 而不是 SSL_CTX_use_PrivateKey_file,以及 SSL_use_certificate 来设置相关证书。

    (我尝试了前者,但无法让它工作。并不一定意味着它不会工作;只是我做不到。)

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 2010-10-23
      • 1970-01-01
      • 2015-06-28
      • 2011-05-21
      • 2023-04-06
      • 2019-05-28
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多