Delphi: IdHTTP+SSL не работает. Нет ошибок!
Я использую TidHTTP + TIdSSLIOHandlerSocketOpenSSL + 2 DLL: ssleay32.dll и libeay32.dll с http://indy.fulgan.com/SSL.
Но я могу видеть всю работу моей программы в HTTP Analyzer! Он работает как HTTP, а не как HTTPS. Если я использую Opera, я не вижу загрузки с того же сайта ( https://esta.cbp.dhs.gov/esta).
Я не установил никаких специальных параметров для TidHTTP и TIdSSLIOHandlerSocketOpenSSL (может быть, я должен, но я не знаю, что именно).
Должен ли я использовать TIdSSLVersion(sslvSSLv23) + местоположение SSL-сертификата? Где я могу получить этот сертификат? Или только RootCertFile?
Как изменить порт idHttp на 443 (я должен это сделать?)?
Я использую:
procedure TForm1.FormCreate(Sender: TObject);
var mem:tmemorystream;
begin
try
mem:=TMemoryStream.Create();
try
idhttp1.Get('https://esta.cbp.dhs.gov/esta/',Mem);
except
on E : Exception do ShowMessage(E.Message);
end;
finally
mem.Free;
idhttp1.Free;
end;
end;
Пожалуйста, смотрите мое видео: http://liga-installer.realservers.info/ssl.mp4
Снимки экрана:
Спасибо спасибо спасибо за помощь!!!
2 ответа
Этот простой пример работает в Delphi XE "из коробки", поэтому вам не нужно менять порты или использовать сертификат на стороне клиента. Он основан на примере из RosettaCode:
Uses
IdHttp, IdSSLOpenSSL
...
procedure TForm2.Button1Click(Sender: TObject);
var
s: string;
lHTTP: TIdHTTP;
begin
lHTTP := TIdHTTP.Create(nil);
try
lHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
lHTTP.HandleRedirects := True;
s := lHTTP.Get('https://esta.cbp.dhs.gov/esta/');
RichEdit1.Text := s;
finally
lHTTP.Free;
end;
end;
Возможно, проблема в версии DLL, которую нужно развернуть. Поскольку последние версии устраняют проблемы безопасности, я рекомендую обновить вашу версию Indy до последней версии и использовать самые последние библиотеки OpenSSL с сайта fulgan.
Обновление: Вы имели в виду, что вы не можете видеть сайт с помощью веб-браузера или что когда вы это делаете, вы не можете видеть трафик в своем HTTP-анализаторе? Как упоминал Роб, если сайт не виден с помощью обычного веб-браузера, проблема, скорее всего, не в вашем приложении.
Вы используете неправильный инструмент для проверки связи. Ваше наблюдение показывает только используемый протокол - который является HTTP 1.0 или 1.1, даже если используется SSL/TLS.
Попробуйте инструмент, такой как SmartSnif или Wireshark, чтобы проверить реальный сетевой трафик. Вы увидите, что весь трафик использует порт 443 с зашифрованными данными.
Ответ заголовка HTTP/1.1 (или 1.0) абсолютно корректен для трафика HTTPS, шифрование SSL / TLS не изменяет передаваемые данные, но является транспортным уровнем поверх трафика HTTP.
Относительно HTTP Analyzer (с их веб-сайта по адресу http://www.ieinspector.com/httpanalyzer/): "Основные функции: поддержка HTTPS, показывает незашифрованные данные, отправленные через соединения HTTPS / SSL, с таким же уровнем детализации, что и HTTP".
Как я уже сказал, он декодирует SSL и показывает незашифрованный трафик на основе HTTP.
С уважением, Арвид