Tôi đang cố gắng thực hiện yêu cầu HTTP2 tới máy chủ (lưu trữ ảo) cung cấp chứng chỉ SSL dựa trên giá trị tiêu đề máy chủ (SNI).
# conn = hyper.HTTP20Connection('http2.akamai.com', port=443, ssl_context=context)
# conn.request('GET', '/path', headers={'Host': 'www.mywebsite.com'})
Gói Hyper-h2 của Python không hỗ trợ SNI hoặc tắt xác minh chứng chỉ! https://hyper.readthedocs.io/en/latest/advanced.html#ssl-tls-certificate-verification
Một cách để vô hiệu hóa xác minh chứng chỉ là sử dụng SSLContext tùy chỉnh và gặp lỗi xác nhận giao thức
Mã cơ bản để thực hiện cuộc gọi HTTP2 bằng SSLContext tùy chỉnh:
nhập khẩu ssl
siêu nhập khẩu
# SSLCONTEXT tùy chỉnh để không xác minh SSLCertificate và Hostname
# hoặc cần SSLCONTEXT để được hỗ trợ SNI
bối cảnh = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
bối cảnh.verify_mode = ssl.CERT_NONE
context.check_hostname = Sai
hyper.tls._context = bối cảnh
conn = hyper.HTTP20Connection('http2.akamai.com', port=443, ssl_context=context)
conn.request('GET', '/')
in conn.get_response()
sai lầm:
Traceback (most recent call last):
Tệp "ssl_custom.py", dòng 32, trong
conn.request('GET', '/')
Tệp "/usr/local/lib/python2.7/site-packages/hyper/http20/connection.py", dòng 281, theo yêu cầu
self.endheaders(message_body=body, Final=True, stream_id=stream_id)
Tệp "/usr/local/lib/python2.7/site-packages/hyper/http20/connection.py", dòng 544, trong tiêu đề cuối
tự kết nối ()
Tệp "/usr/local/lib/python2.7/site-packages/hyper/http20/connection.py", dòng 373, trong connect
khẳng định proto trong H2_NPN_PROTOCOLS hoặc proto == H2C_PROTOCOL
Khẳng địnhLỗi
EDIT/CẬP NHẬT: Bây giờ tôi đã học được cách xây dựng ngữ cảnh một cách chính xác init_context()
Sự cố vẫn tiếp diễn khi thực hiện yêu cầu tới máy chủ hỗ trợ SNI.
ssl_context = init_context()
ssl_context.check_hostname = Sai
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)
in conn.get_response()
Đầu ra:
khẳng định proto trong H2_NPN_PROTOCOLS hoặc proto == H2C_PROTOCOL
Cần một cách để xác định tương đương SNI hoặc Curl - tính năng phân tích cú pháp trong Hyper
Khi sử dụng HTTP/2 qua TLS, máy khách phải thương lượng việc sử dụng HTTP/2 với máy chủ:
các triển khai hỗ trợ HTTP/2 qua TLS PHẢI sử dụng đàm phán giao thức trong TLS [TLS-ALPN]
Việc này được thực hiện thông qua ALPN (trước đây nó được thực hiện thông qua NPN - do đó tại sao nó lại xuất hiện trong thông báo lỗi). Điều này có nghĩa là khi thiết lập ngữ cảnh bạn phải sử dụng TLS Khách hàngHelo
Thông báo thông báo cho khách hàng rằng nó hỗ trợ HTTP/2.
context.set_alpn_protocols(['h2'])
Tôi là một lập trình viên xuất sắc, rất giỏi!