2011-07-13 18 views
11

Wyjaśnij mi, jak pobrać plik z serwera przy użyciu protokołu SSL (https: //). Nie znalazłem odpowiedniej odpowiedzi w Internecie.Delphi: idHttp + SSL

Wszyscy mówią o TIdSSLIOHandlerSocket, ale mam tylko TIdSSLIOHandlerSocketOpenSSL. Mam błąd "nie można załadować biblioteki SSL", jeśli używam TIdSSLIOHandlerSocketOpenSSL. Niektórzy mówią, że potrzebuje biblioteki, ale nawet o tym nie wspominają. Czy muszę korzystać z bibliotek tutaj http://www.indyproject.org/sockets/SSL.EN.aspx?

Mam te pliki DLL w folderze programu. Według: http://edn.embarcadero.com/article/31279 "W czasie wykonywania Indy próbuje załadować libeay32.dll i ssleay32.dll." Nie wiem skąd Indy próbuje załadować DDL -> Mam błąd: "Nie można załadować biblioteki SSL".

procedure TForm1.FormCreate(Sender: TObject); 
    var UpdateMemoryStream:tmemorystream; 
    begin 
    try 
    UpdateMemoryStream:=TMemoryStream.Create; 
       try 
       idhttp2.Get('https://example.com/list.rar',UpdateMemoryStream); //I have: Exception class EIdOSSLCouldNotLoadSSLLibrary with message 'Could not load SSL library.' 
       except 
        on E : Exception do 
        begin showmessage('Error: '+E.Message); 
        end; 
       end; 
    UpdateMemoryStream.SaveToFile('d:\1.rar'); 
    finally 
    UpdateMemoryStream.Free; 
    end; 
    end; 

Dlaczego pojawia się ten błąd? mam Delphi 2010.

+4

'TIdSSLIOHandlerSocket' to nazwa klasy w Indy 9.' TIdSSLIOHandlerSocketOpenSSL' to nowa nazwa klasy w Indy 10. –

Odpowiedz

7

użyć klasy Indy w OpenSSL, trzeba ssleay32.dll i libeay32.dll. Prawdopodobnie powinno to wynikać ze źródła wyjątku w kodzie Indy, który próbowałeś wykonać.

Biblioteki są połączone ze stroną indyjską wymienioną w pytaniu. Jeśli masz taką możliwość, możesz rozpowszechniać je za pomocą aplikacji. Umieść je wszędzie tam, gdzie idą biblioteki DLL (zazwyczaj twój katalog aplikacji).

TIdSSLIOHandlerSocketOpenSSL jest potomkiem specyficznym dla OpenSSL abstrakcyjnej klasy TIdSSLIOHandlerSocket. Jeśli używasz innej biblioteki SSL zamiast OpenSSL, możesz użyć innej klasy potomków.

+0

Nie jest ważne, co i jak używać. Potrzebuję tylko pobrać plik za pomocą idHTTP + SSL.Can podać przykład użycia? Doceniłbym to. Dzięki. – maxfax

+0

@maxfax Wyjątek, który został podniesiony "nie można załadować biblioteki SSL" został rozwiązany przy użyciu tych bibliotek DLL. –

+0

Mam je w folderze programu! Jak połączyć je z TIdSSLIOHandlerSocketOpenSSL? – maxfax

0

Miałem ten sam problem, używam Delphi 2010 kompilując na maszynie 32-bitowej. Kiedy używałem TIdHTTP do wywoływania tylko adresów URL HTTP, wszystko działało poprawnie na obu 32b i 64b.

Potem musiałem zadzwonić HTTPS, Śledziłem wszystkie instrukcje, dodaje ten kod

IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    IdHTTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1; 

I umieścić 2 bibliotek DLL w folderze exe

„Niedziela, 10 kwietnia 2011 01:21 PM 850543 openssl-0.9.8r-i386-win32-rev2.zip "


teraz działa dobrze na komputerze 32b ale na maszynie 64b mi się błąd" Socket Err lub # 10060. Połączenie zostało przekroczone. "po kilku sekundach.

Próbowałem DLL 64-bitowe na wszelki wypadek, produkują błąd „Nie można załadować biblioteki SSL”

ktoś miał ten sam problem? Czy powinienem opublikować więcej kodu?

--- Edytuj - maszyna 32-bitowa uruchamia Win7, maszyna 64-bitowa działa Win8.

+0

Rozwiązany, to nie był problem z 64b, to był problem z Win 8. mogę znaleźć rozwiązanie tutaj http://stackoverflow.com/questions/14756882/indy10-openssl-send-email-code-stopped-working-on-windows-8 IdHTTP1.ReadTimeout: = 30000; – Milan

1

Konieczne jest uzyskanie poprawnych plików DLL, ponieważ niektóre z nich są kompilowane z linkami do M $ Studio i dlatego nie działają w Delphi. Wypróbuj https://indy.fulgan.com/SSL/ Najnowsze wersje znajdują się na dole strony.