我正在尝试与我无法通过 PHP+curl 控制 SSL 的错误网络服务器交谈。
我直接针对openssl lib编写了一个小C程序,并通过它确定,如果我在调用SSL_CTX_set_options()时显式启用openssl选项SSL_OP_NO_COMPRESSION和SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS,我可以让它工作。像这样:
SSL_CTX_set_options(ctx, SSL_OP_NO_COMPRESSION | SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS)
但是,...那是在我孤立的 C 程序中。
当 PHP+curl 建立 SSL 连接时,我可以以某种方式设置这些选项吗?CURL 似乎在更高的层次上运行。
到目前为止,这是我自己的发现:
我知道
curl_setopt
,但我在其列表中看不到类似的选项。我找到了一个叫做流选项的东西,但我不清楚它们如何或是否与 CURL 一起使用,而且我再次看到我需要的选项不匹配。
openssl 上的 PHP手册似乎只涉及处理密钥和证书的功能。
然后,有HttpRequest setSslOptions,但同样,这似乎与 CURL 上下文的选项非常匹配。
更新
在“user2076645”对禁用压缩选项的响应之后,我 git 克隆了 PHP 的源代码并环顾四周。
具体来说,我发现了这段代码:
#if OPENSSL_VERSION_NUMBER >= 0x0090605fL
ssl_ctx_options &= ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS;
#endif
这明确禁用了我需要的选项。我也查看了提交消息,这是对可能对 SSL 的攻击的修复。
所以,我猜它不能从 PHP 完成,目前:-(