【问题标题】:Pycurl SSL Session ID not working, when provided with SSL keys当提供 SSL 密钥时,Pycurl SSL 会话 ID 不起作用
【发布时间】:2017-01-13 20:03:44
【问题描述】:

默认情况下,libcurl(和 pycurl)支持 ssl 连接重用,这意味着对于发送后续 HTTPS 请求的情况,第二个将使用 SSL 会话 ID 并避免完全握手。 (基本上pycurl.SSL_SESSIONID_CACHE就是True)。

当我测试它时:

import pycurl

c = pycurl.Curl()
c.setopt(c.URL, 'https://myserver:443/X')
c.setopt(c.COOKIEFILE, '')
c.setopt(c.VERBOSE, True)

c.perform()

c.setopt(c.FRESH_CONNECT, 1)
c.setopt(c.URL, 'https://myserver:443/Y')
c.perform()

我可以看到 pycurl 使用会话 ID 进行第二个连接。但是,一旦我添加了客户端密钥和 CA 信息(用于相互身份验证),它就会停止工作。这意味着,客户端协商了一个新的 SSL 密钥,这是不可取的。

import pycurl

c = pycurl.Curl()
c.setopt(c.URL, 'https://myserver:443/X')
c.setopt(c.COOKIEFILE, '')
c.setopt(c.VERBOSE, True)
c.setopt(pycurl.SSL_VERIFYHOST, 2)

c.setopt(c.SSLCERTTYPE, "PEM")
c.setopt(c.SSLKEYTYPE, "PEM")
client_cert = "ssl_keys/client/client_crt.pem"
ca_cert = "ssl_keys/ca/ca_crt.pem"
client_key = "ssl_keys/client/client_pr.pem"
c.setopt(c.SSLCERT, client_cert)
c.setopt(c.SSLKEY, client_key)
c.setopt(c.CAINFO, ca_cert)

c.perform()
c.setopt(c.SSL_SESSIONID_CACHE, True) # that doesn't matter really
c.setopt(c.FRESH_CONNECT, 1)
c.setopt(c.URL, 'https://myserver:443/Y')
c.perform()

有什么想法吗?

【问题讨论】:

    标签: python curl libcurl pycurl


    【解决方案1】:

    当客户端证书用于安全目的时,curl 禁用“SSL 会话恢复”。有关详细信息,请参阅 2016 年 8 月的 TLS session resumption client cert bypass 安全公告。

    此功能可以即使使用客户端证书也可以使用,但没有人努力编写代码以安全地完成此操作。我认为用例足够小,可以采用更简单的方法:为客户端证书禁用它。

    【讨论】:

    • 啊……我明白了。无论如何你知道我可以在 python 中做到这一点吗?没有一个 Web 客户端包支持这一点。无论如何要欺骗pycurl来解决?
    • 限制在于 libcurl,因此您必须改进 libcurl 代码才能使其正常工作。或者使用不是基于 libcurl 的支持 SSL 会话恢复的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2021-08-20
    相关资源
    最近更新 更多