你應該看看TransportAdapters,包括源代碼。他們的文檔不是很好,但他們可以低級訪問RFC 2818和RFC 6125中描述的許多功能。尤其是,這些文件鼓勵(需要)客戶端代碼支持特定於應用程序的DNS,以檢查證書CommonName和SubjectAltName。您在這些調用中需要的關鍵字參數是「assert_hostname」。以下是如何與請求庫設置:
from requests import Session, HTTPError
from requests.adapters import HTTPAdapter, DEFAULT_POOLSIZE, DEFAULT_RETRIES, DEFAULT_POOLBLOCK
class DNSResolverHTTPSAdapter(HTTPAdapter):
def __init__(self, common_name, host, pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE,
max_retries=DEFAULT_RETRIES, pool_block=DEFAULT_POOLBLOCK):
self.__common_name = common_name
self.__host = host
super(DNSResolverHTTPSAdapter, self).__init__(pool_connections=pool_connections, pool_maxsize=pool_maxsize,
max_retries=max_retries, pool_block=pool_block)
def get_connection(self, url, proxies=None):
redirected_url = url.replace(self.__common_name, self.__host)
return super(DNSResolverHTTPSAdapter, self).get_connection(redirected_url, proxies=proxies)
def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs):
pool_kwargs['assert_hostname'] = self.__common_name
super(DNSResolverHTTPSAdapter, self).init_poolmanager(connections, maxsize, block=block, **pool_kwargs)
common_name = 'SuperSecretSarahServer'
host = '192.168.33.51'
port = 666
base_url = 'https://{}:{}/api/'.format(common_name, port)
my_session = Session()
my_session.mount(self.base_url.lower(), DNSResolverHTTPSAdapter(common_name, host))
user_name = 'sarah'
url = '{}users/{}'.format(self.base_url, user_name)
default_response_kwargs = {
'auth': (NAME, PASSWORD),
'headers': {'Content-Type': 'application/json'},
'verify': SSL_OPTIONS['ca_certs'],
'cert': (SSL_OPTIONS['certfile'], SSL_OPTIONS['keyfile'])
}
response = my_session.get(url, **default_response_kwargs)
我用common_name
爲預計證書,以及如何您的代碼將引用所需的機器上的名字。我使用host
作爲外部世界認可的名稱 - FQDN,IP,DNS條目,......當然,SSL_OPTIONS字典(在我的示例中)必須在您的機器上列出適當的證書/密鑰文件名。 (另外,NAME和PASSWORD應解析爲更正字符串。)
答案基本相同; 'urllib2'和'requests'都使用相同的'httplib.HTTPConnection'類。 –
你是什麼意思?要麼你正在執行一個DNS查詢,要麼你正在執行一個HTTP請求......你不要一次執行這兩個操作。你的目標是什麼? –
我正在執行一個使用域名的http請求 - 因爲當我使用DNS時域名不會被解析(我提供的域名在其中一個我提到的環境中有DNS域名文件_only_),而在其他地方 - 因爲它們是測試環境)。 – Taku