0
默認情況下,libcurl(和pycurl)支持ssl連接重用,這意味着發送後續HTTPS請求的情況下,第二個會使用SSL會話ID並避免滿握手。 (基本上pycurl.SSL_SESSIONID_CACHE
是True
)。當提供SSL密鑰時,Pycurl SSL會話ID不起作用
當我TESTD它:
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中做到這一點嗎?沒有一個網絡客戶端軟件包支持這一點。無論如何,誘騙pycurl工作? – Amir
這個限制在libcurl中,所以你必須改進libcurl代碼才能使它工作。或者使用不支持基於libcurl的,支持SSL會話恢復的東西。 –