[笔记] Python SSL ALPN 设置协议

最近在研究HTTP2协议,想用Python实现一下服务端。但是网络上所相传的通过字段 Upgrade: h2c 所请求升级到http2根本没用。

因为浏览器只支持加密的http2,而h2c是http2 cleartext(明文http2),所以没有用。

Python docs – ssl.SSLContext.set_alpn_protocols

该文档讲述了加密的http2如何使得服务器在 ALPN 发送报文时告诉客户端服务器所支持的协议

(即当你创建了一个 SSLContext 对象之后可以指定其对客户端返回的支持协议

—下面是Python文档原文

ssl — 套接字对象的 TLS/SSL 包装器

SSLContext.set_alpn_protocols(protocols)
指定在 SSL/TLS 握手期间套接字应当通告的协议。 它应为由 ASCII 字符串组成的列表,例如 ['http/1.1', 'spdy/2'],按首选顺序排列。 协议的选择将在握手期间发生,并依据 RFC 7301 来执行。 在握手成功后,SSLSocket.selected_alpn_protocol() 方法将返回已达成一致的协议。
如果 HAS_ALPN 为 False 则此方法将引发 NotImplementedError
3.5 新版功能.

还有一个很有意思的函数,SSLSocket.selected_alpn_protocol,它在Socket连接建立之后调用会返回客户端所选用的协议。

—下面是Python文档原文

ssl — 套接字对象的 TLS/SSL 包装器

SSLSocket.selected_alpn_protocol()
返回在 TLS 握手期间所选择的协议。 如果 SSLContext.set_alpn_protocols() 未被调用,如果另一方不支持 ALPN,如果此套接字不支持任何客户端所用的协议,或者如果握手尚未发生,则将返回 None
3.5 新版功能.

发表回复