Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Could Not Load SSL Library
#1
Indy bileşenlerini sık sık kullananların eninde sonunda karşılaştığı hata mesajı: Could Not Load SSL Library


Indy bileşenleri ile http ile başlayan web sitelerine istek gönderirken sıkıntı yok:
var
  IdHTTP: TIdHTTP;
  cevap: String;
begin
  IdHTTP := TIdHTTP.Create(nil);
  try
    cevap := IdHTTP.Get('http:// ile başlayan URL :-)' );
    // ...
  finally
    IdHTTP.Free;
  end;

Ama web adresi https ile başlayınca (işin içine security girince) işler biraz karışıyor Smile 

Bu durumda TIdSSLIOHandlerSocketOpenSSL sınıfından yardım alıyoruz:
var
  IdHTTP: TIdHTTP;
  cevap: String;
  IoHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP := TIdHTTP.Create(nil);
  IoHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    // ... belki IoHandler ayarları değiştirilmesi gerekebilir.
    IdHTTP.IOhandler := IoHandler; 
    cevap := IdHTTP.Get('https://............' );
    // ...
  finally
    IdHTTP.Free;
    IoHandler.Free;
  end;

Tabii ki kodları bu şekilde değiştirmek yetmiyor! Ayrıca gerekli DLL'leri de projemizle birlikte kullanıcılara vermemiz gerekiyor. 

Indy bileşenleri (yukarıdaki koddan da anlaşılacağı üzere) SSL gereken bağlantılar için OpenSSL'i kullanıyor.

Aslında işler burada karışıyor: 
Bize gereken DLL'ler; kullandığımız Indy bileşenlerinin versiyonuna göre, hedef işletim sistemine göre(x86, x64) değişebiliyor. Hangi versiyonlar birbiri ile uyumlu buna dikkat etmek gerekiyor. Hatta FMX projesi yapıyorsanız hedef platforma özgü OpenSSL binary'lerinin kullanıcı tarafında olduğundan emin olmak durumundayız.
Sanırım bu durumdan hepimiz muzdaribiz Sad

Bunun çözümü çok basit: TNetHTTPClient kullanmak!  (Emin değilim ama XE8 versiyonu ile birlikte geldi sanırım)

TNetHTTPClient sınıfı OpenSSL kullanmaz. Yukarıda vurgulanan 'security' işini işletim sistemine bırakır. Yani işletim sistemi SSL için ne kullanıyorsa onu kullanır. Biz yazılımcılar da yukarıda bahsedilen sorunlarla uğraşmayız:

var
  NetHTTPClient: TNetHTTPClient;
  rsp: IHTTPResponse;
  cevap: String;
begin
  NetHTTPClient := TNetHTTPClient.Create(nil);
  try
    rsp := NetHTTPClient.Get('https://.....');
    cevap := rsp.ContentAsString();
  finally
    NetHTTPClient.Free;
  end;
There's no place like 127.0.0.1
WWW
Cevapla
#2
Merhaba, 
Değerli bilgiler ve detaylı açıklamalar için teşekkür ederim.
FMX mimarisinde; https URL istekleri için NetHTTPClient veya TRESTClient, TRESTRequest ve TRESTResponse bileşenlerini kullanırsanız, SSL Library kullanım ihtiyacı duymaz (Bağlantı türü SSL ise arka planda platform api'lerinden faydalanarak bu ihtiyacı karşılar) .
Cevapla
#3
Evet haklısınız:
http://docwiki.embarcadero.com/RADStudio...nt_Library

"The framework operates on the newer TNetHTTPClient, which is based on system HTTP client sockets. This allows it to leverage the OS's ability to automatically resolve and deal with SSL/TLS/HTTPS."


Yenilikçi olmakta fayda var gibi Smile
There's no place like 127.0.0.1
WWW
Cevapla
#4
denemek lazım teşekkürler
Cevapla
#5
(07-06-2018, Saat: 15:01)SimaWB Adlı Kullanıcıdan Alıntı: Bunun çözümü çok basit: TNetHTTPClient kullanmak!  (Emin değilim ama XE8 versiyonu ile birlikte geldi sanırım)

TNetHTTPClient sınıfı OpenSSL kullanmaz. Yukarıda vurgulanan 'security' işini işletim sistemine bırakır. Yani işletim sistemi SSL için ne kullanıyorsa onu kullanır. Biz yazılımcılar da yukarıda bahsedilen sorunlarla uğraşmayız:

var
  NetHTTPClient: TNetHTTPClient;
  rsp: IHTTPResponse;
  cevap: String;
begin
  NetHTTPClient := TNetHTTPClient.Create(nil);
  try
    rsp := NetHTTPClient.Get('https://.....');
    cevap := rsp.ContentAsString();
  finally
    NetHTTPClient.Free;
  end;
  rsp := NetHTTPClient.Get('https://www.digicert.com/ssl/');
olarak denediğim zaman

"Server Certificate Invalid or not present."

hata mesajı alıyorum.


RAD Studio 10.1 Berlin Version 24.0.25048.9432
Win 7 Pro
Cevapla
#6
Şu anda deneme şansım yok maalesef ama araştırdığım kadarıyla şöyle bir çözüm sunmuşlar:

TNetHTTPClient'in OnValidateServerCertificate olayında
Accepted: = True;
yazmanız yeterliymiş.
There's no place like 127.0.0.1
WWW
Cevapla
#7
(08-06-2018, Saat: 11:57)SimaWB Adlı Kullanıcıdan Alıntı: Şu anda deneme şansım yok maalesef ama araştırdığım kadarıyla şöyle bir çözüm sunmuşlar:

TNetHTTPClient'in OnValidateServerCertificate olayında
Accepted: = True;
yazmanız yeterliymiş.

önceki mesajı yazmadan önce araştırıp aynı yöntemi denemiştim. olmamıştı
siz yazınca tekrar denedim ama yine olmadı Sad aldığım hata mesajı

"Error getting Server Certificate."
Cevapla
#8
Aynı sorunu yaşayan birisi burada anlattığına göre problemi bir Windows Patch ile çözmüş.
There's no place like 127.0.0.1
WWW
Cevapla
#9
windows patch çözüm olmadı
ama patch uygulamadığım sanal pc'de, bir başka ssl'li site de NetHTTPClient.Get sorun çıkartmadan çalıştı
sanırım sitenin ssl versiyonu önemli bir parametre
Cevapla
#10
İyi günler. Bazı güncel güvenlik protokolleri nedeniyle windowsun kesinlikle güncellenmiş olması gerekmektedir. Hatta bazı durumda ekstra ayar yapmak da gerekebilir. Mesela güncel bir win7 için TLS1.2 güvenliği için ilave olarak Registry de
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\WinHttp
klasörü altında (DWORD) 16 lık değer olarak
DefaultSecureProtocols=a00
ataması yapılması gerekebilmektedir.

Indy bileşenlerine gelince, onunla da alakalı bazı ayarlar gerekebiliyor bazı durumlarda.
(07-06-2018, Saat: 15:01)SimaWB Adlı Kullanıcıdan Alıntı: Indy bileşenleri (yukarıdaki koddan da anlaşılacağı üzere) SSL gereken bağlantılar için OpenSSL'i kullanıyor.
+"TIdSSLIOHandlerSocketOpenSSL" bileşeni ekleyin,
-SSLOptions.Method = sslvTLSv1_2 (TLS1.2 için)
-SSLOptions.SSLVersions = [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2] (bağlanılacak sunucunun kullanması muhtemel versiyonlar)

+"TIdHTTP" bileşeninin,
-IOHandler özelliğine yukarıdaki ayarlara sahip ("TIdSSLIOHandlerSocketOpenSSL" tipli) bileşeni ayarlayın,
-Request.UserAgent:='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'; olarak değiştirin, (bazı siteler güncel olmayan tarayıcılarda açılmamak üzere ayarlanmış olabiliyor)
gibi ekstra ayarlar yapmak gerekebilir. Basit bir Request.UserAgent ayarı yapmakla çözüme kavuştuğum bazı durumlar olduğu için bu noktayı ihmal etmemek gerekebiliyor. İyi çalışmalar.
Cevapla




Konuyu Okuyanlar: 1 Ziyaretçi