EIdOSSLUnderlyingCryptoError Exception

后端 未结 3 1161
小蘑菇
小蘑菇 2021-01-03 10:37

I am using Indy (IdHTTP, OpenSSL). I use this simple code to download a page

var
  IdHTTP: TIdHTTP;
begin
  IdHTTP:=TIdHTTP.Create;
  try
    IdHTTP.Get(\'ht         


        
3条回答
  •  一个人的身影
    2021-01-03 11:07

    Here is sample code on how to fix this issue using SSL_set_tlsext_host_name

    It is done by creating a custom class inheriting from TIdHTTP, and calling SSL_set_tlsext_host_name with the correct parameters by using the OnStatusInfoEx event of TIdSSLIOHandlerSocketOpenSSL

    This issue started appearing on all Cloudflare SSL-enabled websites about a month ago.

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      System.Classes, IdHTTP, IdSSL, IdSSLOpenSSL, IdSSLOpenSSLHeaders, IdCTypes;
    
    type
      TCustomIdHTTP = class(TIdHTTP)
      public
        constructor Create(AOwner: TComponent);
      private
        procedure OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: TIdC_INT; const AType, AMsg: String);
      end;
    
    { TCustomIdHTTP }
    
    constructor TCustomIdHTTP.Create(AOwner: TComponent);
    begin
      IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      with IOHandler as TIdSSLIOHandlerSocketOpenSSL do begin
        OnStatusInfoEx := Self.OnStatusInfoEx;
        SSLOptions.Method := sslvSSLv23;
        SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1];
      end;
      inherited Create(AOwner);
    end;
    
    procedure TCustomIdHTTP.OnStatusInfoEx(ASender: TObject; const AsslSocket: PSSL; const AWhere, Aret: TIdC_INT;
      const AType, AMsg: String);
    begin
      SSL_set_tlsext_host_name(AsslSocket, Request.Host);
    end;
    //////////////////
    
    var
      MyHTTP: TCustomIdHTTP;
    begin
      MyHTTP := TCustomIdHTTP.Create(nil);
      // Your normal Indy HTTP code here
      MyHTTP.Free;
    end.
    

提交回复
热议问题