如何禁用 ALPN 扩展?

Posted

技术标签:

【中文标题】如何禁用 ALPN 扩展?【英文标题】:How to disable ALPN extension? 【发布时间】:2020-03-27 03:11:08 【问题描述】:

根据this,在 libcurl 中,CURLOPT_SSL_ENABLE_ALPN 选项默认启用。对于一个项目,我正在尝试禁用 ALPN 扩展,如下所示:

CURLcode res = CURLE_OK;
res = curl_easy_setopt(curl_, CURLOPT_SSL_ENABLE_ALPN, 0L);
if(res == CURLE_OK)
    cout<<"Set CURLOPT_SSL_ENABLE_ALPN to 0L res = "<<res;
else
    cout<<"Set CURLOPT_SSL_ENABLE_ALPN to 1L  res = "<<res<<"\t"<<curl_easy_strerror(res);

这给我一个错误:

Set CURLOPT_SSL_ENABLE_ALPN to 1L  res = 48   An unknown option was passed in to libcurl

而且,我可以看到 TLS 握手中存在 ALPN 扩展,能够通过 Wireshark 看到它。 Openssl 版本:OpenSSL 1.1.0k 卷曲版本:7.67.0

【问题讨论】:

您能否验证您的应用程序正在链接到足够现代的 curl 版本?也许它正在某个地方使用旧版本。 @Botje,帖子中提到的curl版本是使用curl API直接从库中获取的,curl_version_info(CURLVERSION_NOW),也使用ldd命令进行验证。 【参考方案1】:

在 libcurl 中,所有可能的选项在标头中都是 #define'd,但这并不意味着所有选项都受支持。

您的 libcurl 似乎没有使用 HTTP2 支持 (libnghttp2) 构建。

要使 ALPN 或 NPN 实际工作,curl_version_info() 应包括 CURL_VERSION_HTTP2

【讨论】:

ALPN 和 NPN 独立于 HTTP2 使用。 github.com/curl/curl/pull/4672【参考方案2】:

显然,如果您不使用支持 HTTP2 的 libcurl (libnghttp2) 进行编译,它会将 CURLOPT_SSL_ENABLE_ALPNCURLOPT_SSL_ENABLE_NPN 视为未知选项,尽管 ALPN 和 NPN 独立于 HTTP2。这是 libcurl 中的一个错误。 我在 libcurl github repo here 上报告了这种行为,他们修复了它,修复将在下一个版本中提供。

【讨论】:

以上是关于如何禁用 ALPN 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

ALPN 回调被丢弃:HTTP/2 被禁用。 IBM Webshere 9 JAVA 8 上的启动类路径上的 alpn-boot

如何禁用响应 nginx 或 apache 或 caddy 中的 http1 请求?

如何为无 ALPN 客户端配置 Nginx 仅支持 HTTP2

如何在 Chrome 扩展程序中禁用同源策略?

如何通过excludedActivityTypes 禁用扩展共享?

如何禁用应用程序扩展?