07-06-2018, Saat: 15:01
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:
Ama web adresi https ile başlayınca (işin içine security girince) işler biraz karışıyor
Bu durumda TIdSSLIOHandlerSocketOpenSSL sınıfından yardım alıyoruz:
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
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:
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
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
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