2017-01-13 44 views
0

默認情況下,libcurl(和pycurl)支持ssl連接重用,這意味着發送後續HTTPS請求的情況下,第二個會使用SSL會話ID並避免滿握手。 (基本上pycurl.SSL_SESSIONID_CACHETrue)。當提供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() 

任何想法?

回答

0

當客戶端證書用於安全目的時,curl禁用「SSL會話恢復」。有關細節,請參閱2016年8月的TLS session resumption client cert bypass安全通報。

此功能可能甚至與客戶端證書一起工作,但沒有人爲編寫代碼而努力以安全的方式完成。我認爲該用例足夠小,可以採用更簡單的路由:爲客戶端證書禁用它。

+0

啊......我明白了。無論如何,你知道我可以在Python中做到這一點嗎?沒有一個網絡客戶端軟件包支持這一點。無論如何,誘騙pycurl工作? – Amir

+0

這個限制在libcurl中,所以你必須改進libcurl代碼才能使它工作。或者使用不支持基於libcurl的,支持SSL會話恢復的東西。 –