使用 WinSSL、NTLM、HTTP2、SSH2 和 IPv6 支持构建工作 libcurl

2022-08-30 10:37:53

在我们的PHP应用程序中,我们需要以某种方式构建PHP curl扩展,它支持以下功能:

  • WinSSL(访问 Windows 证书存储区)
  • NTLM、基本和摘要式身份验证
  • HTTP/2 支持
  • 支持 SSH2
  • 支持 IPv6

我试图以某种方式构建curl来实现这一点:

  • 将其与 WinSSL 链接
  • 将其与nghttp2链接
  • 将其与 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:\curl\deps-x64

在卷曲子文件夹中。然后,我根据结果编译了PHP curl扩展。winbuild/

因此,当对提供基本,摘要,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-curl扩展?


答案 1

我相信这里的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: %s\n", o->ssl_version);
   printf("NTLM: %d\n", o->features & CURL_VERSION_NTLM);
   printf("HTTP/2: %d\n", o->features & CURL_VERSION_HTTP2);
   printf("SSH2: %s\n", o->libssh_version);
   printf("IPv6: %d\n", o->features & CURL_VERSION_IPV6);
}

建:

cc https.c `
'-Icurl-7.70.0-win64-mingw\include' `
'-Lcurl-7.70.0-win64-mingw\lib' `
-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和WinSSL两者兼而有之?如果不是这种情况,你可以用以下命令自己构建LibCurl:OpenSSL/1.1.1g (Schannel)CFG=-winssl

https://github.com/nu8/gulf/blob/master/c-https/1-curl.ps1


答案 2

推荐