编辑:线程:https://security.stackexchange.com/questions/179352/winhttp-prevent-successful-handshake-if-peer-certificate-is-invalid讨论并回答问题。现在可以关闭了

在delphi项目上使用Windows平台提供的WinHTTP进行对服务器的调用。

脚本:

userAgent := 'TestClient.exe';
  hsession := WinHttpOpen(pwidechar(userAgent), WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, nil, nil, 0);
  if(hsession = nil) then ShowMessage('Failed WinhttpOpen');
  p := 'https';
  port := 443;
  requestflags := WINHTTP_FLAG_SECURE;
  server := '10.0.0.221';

  hconnection := WinHttpConnect(hsession, PWideChar(server), port, 0);
  if(hconnection = nil) then
  begin
    le := GetLastError;
    ShowMessage('Failed to connect: ' + IntToStr(le));
  end;

  Action := 'GET';
  hInetRequest := WinHttpOpenRequest(hconnection, pwidechar(Action), nil, nil, nil, nil, WINHTTP_FLAG_SECURE);
  if(hInetRequest = nil) then
  begin
    le := GetLastError;
    ShowMessage('Failed to connect: ' + IntToStr(le));
  end;

  WinResult:=WinHttpSendRequest(hInetRequest, nil,0, 0, 0,0,0);

  if(not WinResult) then
  begin
    le := GetLastError;
    WinHttpCloseHandle(hInetRequest);
    ShowMessage('No result obtained : ' + IntToStr(le));
  end;


需要;
为了安全起见,连接必须在SSL握手后立即终止。如果对等证书被视为无效。

实际:
发生的情况是,即使证书无效,客户端(使用winhttp)也会进行呼叫并成功确认TLS握手。但是,在握手之后和完成请求之前,它将终止引发'12175'错误的连接。这是无效证书的错误。哪个是对的。

问题:
为了通过合规性,WinHTTP必须不允许成功的握手,因此必须更早地终止连接。

Wireshark屏幕附在下面:(10.0.0.221是服务器)
security - Winhttp-如果对等证书无效,则阻止成功握手-LMLPHP

最佳答案

我认为您不走运,因为这就是WinHTTP的设计方式。在WinHttpConnect函数文档(强调)中,nServerPort参数的值INTERNET_DEFAULT_HTTPS_PORT描述了发生的情况:


INTERNET_DEFAULT_HTTPS_PORT

使用HTTPS服务器的默认端口(端口443)。选择这个
端口不会自动建立安全连接。你必须
仍然使用来指定使用安全交易语义
带有WinHttpOpenRequest的WINHTTP_FLAG_SECURE标志。


这意味着您需要打开(并发送)带有指定的WINHTTP_FLAG_SECURE标志的请求以建立安全连接。

关于security - Winhttp-如果对等证书无效,则阻止成功握手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48644453/

10-13 03:10