"1408F10B: rotinas SSL: SSL3_GET_RECORD: chamada de número de versão incorreta:" no Indy
Eu tenho um aplicativo da web que faz frequentesTIdHTTP chamadas para a API do Google Analytics (cerca de 25.000 a 50.000 por dia). De tempos em tempos, as chamadas para a API falham com a mensagem de erro na linha de assunto (muitas vezes - menos de 1 em 1000 vezes). Nunca consegui encontrar um padrão para que isso acontecesse. E tentar novamente a chamada com falha geralmente funciona. Então parece inteiramente aleatório.
Eu tenho a versão mais recente do openssl (1.0.2.1 - 20/03/2015). E a versão mais recente do Indy (arquivos de código-fonte datados de 01/07/2015).
Abaixo está o código fonte básico para fazer essas chamadas.
Alguém tem alguma idéia do que poderia ser?
Fazer duas chamadas simultâneas à API afetaria as coisas (isso está ocorrendo em um aplicativo Web com vários threads)?
IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
IdSSLIOHandlerSocket1.PassThrough := True;
IdHTTP := TIdHTTP.create(nil);
IdHTTP.reusesocket := rsTrue;
IdSSLIOHandlerSocket1.reusesocket := rsTrue;
idhttp.handleredirects := True;
with IdSSLIOHandlerSocket1 do begin
SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 2;
end;
with IdHTTP do begin
IOHandler := IdSSLIOHandlerSocket1;
ProxyParams.BasicAuthentication := False;
Request.UserAgent := 'EmbeddedAnalytics API Interface';
Request.ContentType := 'text/html';
request.connection := 'close';
Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Request.BasicAuthentication := False;
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
HTTPOptions := [hoForceEncodeParams];
Request.AcceptEncoding := 'gzip,deflate';
Request.CustomHeaders.Add('Accept-Language: en-us,en;q=0.5');
idhttp.Request.CustomHeaders.Add('Authorization: Bearer '+FToken);
end;
idhttp.get(':https://www.googleapis.com/analytics/v3/data/realtime?ids=..........');
Atualização 1 atualize algumas linhas de código para:
SSLOptions.Method := sslvSSLv3;
SSLOptions.SSLVersions := [sslvSSLv3];
Funciona. Vou monitorar e ver se os erros de SSL desaparecem.
Solução Acontece que as alterações feitas no sslVSSLv3 o corrigiram. Não recebo mais os erros! Isso é um tanto surpreendente, visto que a maioria dos outros serviços está adotando o TLS.