我正在尝试向服务器(虚拟托管)发出HTTP2请求,该服务器根据主机头值(SNI)提供SSL证书。
# conn = hyper.HTTP20Connection('http2.akamai.com', port=443, ssl_context=context)
# conn.request('GET', '/path', headers={'Host': 'www.mywebsite.com'})
Python的Hyper-h2软件包不支持SNI或禁用证书验证! https://hyper.readthedocs.io/en/latest/advanced.html#ssl-tls-certificate-verification
禁用证书验证的一种方法是使用自定义SSLContext,并陷入协议断言错误
使用自定义SSLContext进行HTTP2调用的基本代码:
import ssl
import hyper
# Custom SSLCONTEXT for not verifying SSLCertificate and Hostname
# or need SSLCONTEXT for SNI support
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
context.verify_mode = ssl.CERT_NONE
context.check_hostname = False
hyper.tls._context = context
conn = hyper.HTTP20Connection('http2.akamai.com', port=443, ssl_context=context)
conn.request('GET', '/')
print conn.get_response()
错误:
Traceback (most recent call last):
File "ssl_custom.py", line 32, in <module>
conn.request('GET', '/')
File "/usr/local/lib/python2.7/site-packages/hyper/http20/connection.py", line 281, in request
self.endheaders(message_body=body, final=True, stream_id=stream_id)
File "/usr/local/lib/python2.7/site-packages/hyper/http20/connection.py", line 544, in endheaders
self.connect()
File "/usr/local/lib/python2.7/site-packages/hyper/http20/connection.py", line 373, in connect
assert proto in H2_NPN_PROTOCOLS or proto == H2C_PROTOCOL
AssertionError
编辑/更新:现在我已经学会了如何正确构建上下文init_context()
,当向启用SNI的服务器发出请求时问题仍然存在。
ssl_context = init_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_OPTIONAL
headers={'Host': 'www.opentable.com'}
conn = hyper.HTTP20Connection('ev-www.opentable.com.edgekey.net', port=443, ssl_context=ssl_context)
conn.request('GET', '/washington-dc-restaurants', headers=headers)
print conn.get_response()
输出:
assert proto in H2_NPN_PROTOCOLS or proto == H2C_PROTOCOL
需要一种方法来指定SNI或Curl等效 - 在Hyper
中解析功能答案 0 :(得分:0)
在TLS上使用HTTP / 2时,客户端必须与服务器协商使用HTTP / 2:
通过TLS支持HTTP / 2的实现必须使用协议 TLS中谈判[TLS-ALPN]
这是通过ALPN完成的(历史上是用NPN完成的 - 因此它出现在错误信息中)。这意味着在设置上下文时,您必须通告客户端在TLS updatepassword()
消息中支持HTTP / 2。
ClientHelo