Я пытаюсь отправить сообщение через службу адресов ssl, и у меня время ожидания соединения 10060. Моя библиотека ssl и конфигурации Indy SSl верны, потому что я использовал тот же код при отправке электронной почты с помощью gmail и других служб.
Я отправил почтальону, что он работает.
мой код
const
Api = 'https://xxxx.xxxx.com/api/detection/Insert';
procedure TRestSender.SendThreats(CustomerId: Integer;
DetectionName, Filename: String);
var
PostData: TStringList;
res: string;
Https: TIdHttp;
IdSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
Https := Tidhttp.Create(nil);
PostData := TStringList.Create;
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Https.ReadTimeout := 10000;
Https.ConnectTimeout:= 10000;
IdSSL.SSLOptions.Method := sslvTLSv1;
// IdSSL.OnStatusInfo:= ssl1StatusInfo;
IdSSL.SSLOptions.Mode := sslmClient;
Https.IOHandler := IdSSL;
try
PostData.Add('Content-Type:application/x-www-form-urlencoded');
PostData.Add('CustomerId=' + IntToStr(CustomerId));
PostData.Add('DetectionName=' + DetectionName);
PostData.Add('DeviceName=' + ComputerName());
PostData.Add('Filename=' + Filename);
PostData.Add('ApiUser=' + 'some-code');
PostData.Add('ApiPass=' + 'some-paswd');
res := Https.Post(Api, PostData);
finally
PostData.Free;
Https.Free;
IdSSL.Free;
end;
end;
У меня есть два предложения:
Неправильная версия TLS: все больше и больше служб отключают TLS 1.0 и / или TLS1.1. Версия по умолчанию - TLS 1.0.
const
DEF_SSLVERSION = sslvTLSv1;
DEF_SSLVERSIONS = [sslvTLSv1];
Итак, добавьте следующую строку:
IdSSL.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1];
Отсутствует поддержка SNI (пример для SNI).
спасибо за предложения, он работал с конфигурациями SNI. Большое спасибо.
Если вы используете SSLOptions.SSLVersions
, НЕ используйте SSLOptions.Method
(и наоборот). Установка одного обновляет другой. Также обратите внимание, что порядок, в котором вы указываете флаги между скобками [ ]
, не имеет значения, [sslvTLSv1_2, sslvTLSv1_1, sslvTLSv1]
и [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]
идентичны. И да, SNI уже обрабатывается автоматически в последних версиях Indy.
Спасибо за комментарий @remy, на самом деле у меня есть вопрос, но я не хочу открывать новый вопрос, на самом деле на ту же тему. Я использую RestClient для той же веб-службы, но в другом проекте. Когда я вызываю службу под ssl, RestClient получает ту же ошибку (тайм-аут 10600). Как я могу настроить RestClient для ssl post и Get методов?
@JamesFranklin Это другой вопрос, не связанный с TIdHTTP
, поэтому его следует опубликовать отдельно. Пожалуйста, следуйте инструкциям StackOverflow по этому поводу. В любом случае у меня нет ответа на этот вопрос, я не знаю, как RestClient работает внутри, или как настроить его параметры SSL (если даже возможно).
Кстати, НЕ добавляйте запись
Content-Type
в свойPostData
. Вместо этого это значение принадлежит свойствуTIdHTTP.Request.ContentType
:Https.Request.ContentType := 'application/x-www-form-urlencoded';
, что на самом деле не нужно делать вручную, поскольку версияTStrings
дляTIdHTTP.Post()
обрабатывает это внутренне за вас.