在我们的PHP应用程序中,我们需要以某种方式构建PHP curl扩展,它支持以下功能:
- WinSSL(访问Windows证书存储)
- NTLM、基本身份验证和摘要式身份验证
- HTTP/2支持
- SSH2支持
- IPv6支持
我试图用一种方法来构建卷曲:
- 将其链接到WinSSL
- 将其与nghttp 2链接
- 将其与libssh2链接
- 启用IPv6
我用命令行这样做:
nmake /f Makefile.vc mode=dll VC=15 ENABLE_WINSSL=yes DEBUG=no MACHINE=x64 ENABLE_SSPI=no WITH_NGHTTP2=dll WITH_ZLIB=static WITH_SSH2=static WITH_DEVEL=C:curldeps-x64
在卷曲winbuild/
子文件夹中。然后,我根据结果编译了PHP curl扩展。
因此,当对提供基本、摘要、NTLM和协商身份验证(Exchange web服务)的web服务执行HTTP请求时,我会出现以下错误行为:
如果使用
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
,则一切正常。如果使用
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
,一切也会正常工作。如果使用
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM | CURLAUTH_BASIC);
,则身份验证失败。
失败的请求包含一个NTLM令牌,该令牌太短(似乎在某个时刻被切断)。一些谷歌搜索表明,这可能是由于curl被编译为使用SSPI。但是,我不能禁用SSPI,因为WinSSL需要它。
有人知道解决这个问题的办法吗?如何获得满足上述所有要求的php-ccurl扩展?
我相信这里的LibCurl满足所有这些:
https://curl.haxx.se/windows
使用此文件:
#include <curl/curl.h>
#include <stdio.h>
int main() {
curl_version_info_data *o = curl_version_info(CURLVERSION_NOW);
printf("SSL: %sn", o->ssl_version);
printf("NTLM: %dn", o->features & CURL_VERSION_NTLM);
printf("HTTP/2: %dn", o->features & CURL_VERSION_HTTP2);
printf("SSH2: %sn", o->libssh_version);
printf("IPv6: %dn", o->features & CURL_VERSION_IPV6);
}
构建:
cc https.c `
'-Icurl-7.70.0-win64-mingwinclude' `
'-Lcurl-7.70.0-win64-mingwlib' `
-lcrypt32 `
-lcurl `
-lwldap32 `
-lws2_32
结果:
SSL: OpenSSL/1.1.1g (Schannel)
NTLM: 16
HTTP/2: 65536
SSH2: libssh2/1.9.0
IPv6: 1
我没有用Visual Studio构建,但Clang:
https://github.com/mstorsjo/llvm-mingw
我也不确定OpenSSL/1.1.1g (Schannel)
到底是什么,我想它的意思是OpenSSL和WinSSL都是?如果不是这样,您可以使用CFG=-winssl
:自己构建LibCurl
https://github.com/nu8/gulf/blob/master/c-https/1-curl.ps1