use*_*005 7 python https pyopenssl python-3.x python-requests
用例:我想通过 python 请求模块找出主机名支持多少密码。
我找不到提供密码名称来请求模块挂钩的方法。任何人都可以建议提供指定密码的方法。
import ssl
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
class Ssl3HttpAdapter(HTTPAdapter):
""""Transport adapter" that allows us to use SSLv3."""
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(
num_pools=connections, maxsize=maxsize,
block=block, ssl_version=ssl.PROTOCOL_SSLv3)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是请求版本 2.12.0+,则有一篇关于使用请求配置 TLS的博客文章,其中描述了允许您配置 SSLContext 的新功能(请注意,此博客文章是在 OP 提出问题之后编写的):
Requests v2.12.0 中添加的功能是 urllib3 现在在 ConnectionPool 对象的构造函数中接受 SSLContext 对象。此 SSLContext 将用作底层 TLS 连接的工厂,因此应用于它的所有设置也将应用于那些低级连接。
最好的方法是使用 SSLContext 工厂函数 requests.packages.urllib3.util.ssl_.create_urllib3_context。这类似于 Python 的 ssl.create_default_context 函数,但应用了 Requests 和 urllib3 都使用的更严格的默认 TLS 配置。此函数将返回一个 SSLContext 对象,然后可以应用进一步的配置。最重要的是,该函数还需要一些参数来允许覆盖默认配置。
要提供新的 SSLContext 对象,您需要编写适合给定主机的 TransportAdapter。
以下示例代码作为如何使用此方法在请求中重新启用 3DES 的示例。
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context
# This is the 2.11 Requests cipher string, containing 3DES.
CIPHERS = (
'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:'
'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:'
'!eNULL:!MD5'
)
class DESAdapter(HTTPAdapter):
"""
A TransportAdapter that re-enables 3DES support in Requests.
"""
def init_poolmanager(self, *args, **kwargs):
context = create_urllib3_context(ciphers=CIPHERS)
kwargs['ssl_context'] = context
return super(DESAdapter, self).init_poolmanager(*args, **kwargs)
def proxy_manager_for(self, *args, **kwargs):
context = create_urllib3_context(ciphers=CIPHERS)
kwargs['ssl_context'] = context
return super(DESAdapter, self).proxy_manager_for(*args, **kwargs)
s = requests.Session()
s.mount('https://some-3des-only-host.com', DESAdapter())
r = s.get('https://some-3des-only-host.com/some-path')
Run Code Online (Sandbox Code Playgroud)
还有一个 hack 可能,你可以在请求模块的github 页面上阅读,或者在/sf/answers/2285637721/但它修改了底层库代码,我不推荐它(请求模块的作者也没有,正如您将在该页面上找到的那样)。另一方面,如果您使用的是较旧的请求包并且无法升级,则它可能是您的最佳选择。它相当于覆盖 urllib3 模块的DEFAULT_CIPHERS:
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':RC4-SHA'
Run Code Online (Sandbox Code Playgroud)
如果您有其他代码在修改后将使用请求模块,但不需要修改,您可能希望恢复DEFAULT_CIPHERS到其以前的值。
| 归档时间: |
|
| 查看次数: |
9294 次 |
| 最近记录: |