2016-05-08 122 views
5

我想在Delphi西雅圖的TIdHTTP.Get中下載一個文件。這是一個android應用程序,我所有的嘗試都失敗了。所有我得到它是相同的錯誤「無法加載SSL庫」。這是程序:使用TidHTTP在Android上加載「無法加載SSL庫」錯誤

procedure TfrmMain.DownloadPicture(const AURL: string); 
var 
    MeS: TMemoryStream; 
    cidSSL: TIdSSLIOHandlerSocketOpenSSL; 
    cidHTTP: TIdHTTP; 
begin 
    cidHTTP:= TIdHTTP.Create(nil); 
    cidSSL:= TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    Mes := TMemoryStream.Create; 

    try 
    cidHTTP.ReadTimeout := 30000; 
    cidHTTP.IOHandler := IdSSL; 
    cidSSL.SSLOptions.Method := sslvSSLv3; 
    cidSSL.SSLOptions.Mode := sslmUnassigned; 
    cidSSL.StartSSL; 
    cidHTTP.Get(AURL, Mes); 
    except 
    on E : Exception do 
     begin showmessage('Error: '+E.Message); 
     end; 
    end; 
    Mes.Position := 0; 
    frmImage.Image.Bitmap.LoadFromStream(Mes); 
end; 

回答

6

如果你是不是使用Android 6 Marshmallow,OpenSSL應該可以在Android上正常工作。當您收到「無法加載」錯誤時,您可以撥打IdSSLOpenSSLHeaders單元中的Indy的WhichFailedToLoad()函數,以瞭解OpenSSL無法加載的原因。如果您的設備沒有預先安裝OpenSSL,則可以將OpenSSL二進制文件與您的應用程序一起部署,並使用Indy的IdOpenSSLSetLibPath()函數告訴Indy從哪裏加載它們。

這就是說,從Android 6 Marshmallow開始,Google no longer supports OpenSSL在Android上。它已被替換爲名爲BoringSSL的自定義分支,其中Indy does not fully support yet(儘管一些 BoringSSL相關的更改已在西雅圖發佈後發佈給Indy)。因此,如果您在Android 6上使用Indy SSL/TLS時遇到問題,您可以嘗試升級到最新的SVN snapshot,以查看它是否有幫助(撰寫本文時,當前的SVN修訂版爲5359)。

BoringSSL使一些主要更改爲OpenSSL API接口(刪除函數,更改數據類型等),因此它不與現有的OpenSSL代碼向後兼容。但更糟糕的是,BoringSSL使用與OpenSSL相同的庫文件名,並且在設備啓動時預加載,因此無法使用Android應用程序部署定製的OpenSSL庫二進制文件。當應用程序嘗試在運行時加載OpenSSL庫文件名時(無論您是否調用Indy的IdOpenSSLSetLibPath()函數),Android將簡單地使用預加載的BoringSSL二進制文件。

印地運行在Android上,而不是Java級別的NDK水平,從而使印避免BoringSSL將要求用戶要麼:

  1. 重新編譯以新的文件名不抵觸OpenSSL庫BoringSSL(AFAIK沒有這個可用的已知版本),然後更新Indy使用這些文件名。

  2. 將OpenSSL源代碼直接編譯到他們的Android應用程序中。 Indy目前尚未設置爲在iOS以外的任何平臺上支持OpenSSL的靜態鏈接,但如果有人能夠在Android上爲OpenSSL生成可行的.a文件,則這應該是對Indy的IdSSLOpenSSLHeaders_static單元更新相關定義的一個小改動。我知道至少有一個用戶嘗試這種路由,但該用戶還沒有成功(獲取源代碼以正確鏈接的錯誤)。

  3. 切換到Android的更高級別的基於Java的加密API。這是Google首選的解決方案。但是Indy目前不支持它。這樣做需要編寫一套全新的用於Android套接字I/O和SSL/TLS的TIdStackTIdIOHandler類,使用JNI調用來訪問Java API。但是這具有需要處理的性能和線程問題。

因此,目前還沒有可行的解決方法可用於使Indy SSL/TLS在Android 6+上運行。


更新:在英巴卡迪諾論壇用戶能夠找到的OpenSSL .so文件在Android 6印第安納波利斯和工作是一致:

https://forums.embarcadero.com/thread.jspa?threadID=211089

的許多報告後我的應用程序崩潰,如果安裝在Android 6設備我已經搜索了網絡的一些提示和需要.so編譯文件,1.02版本,將兩個文件添加到我的應用程序的Play商店部署(資產\內部),並改變了Indy的路徑調用

IdOpenSSLSetLibPath(TPath.GetDocumentsPath)

在我的數據模塊的OnCreate

對我的代碼進行修改後,我的Apps可以在我的全新S7上使用Android 6.0.1以及所有其他最新的Android設備(使用Play Store部署進行測試)完美運行。

現在谷歌的警告彈出告訴我,與我的應用程序部署的OpsnSSL文件不是最低要求1.02f版本(或1.01r)....所以我的帖子在這個論壇。

...

反正你可以在這裏下載最新的.so文件,我在這一刻部署的: https://drive.google.com/file/d/0B7AxqW32K0oXWW9nUk9qaFpHT0k/view?usp=sharing

在同一個討論的另一個用戶也似乎有一些成功以及:

我一直在Android 6上運行加載.so庫只是好幾個月。新問題是我們需要編譯新版本的openssl庫。 Cygwin的工作不正常編譯對我這樣的IM切換到Linux安裝創建它們(如果可能)https://wiki.openssl.org/index.php/Android#Build_the_OpenSSL_Library_2

繼承人庫,你可以抓住當前的一些預置的那些https://github.com/emileb/OpenSSL-for-Android-Prebuilt.git


更新:以下(德語)論壇討論爲註冊用戶提供了Android(和iOS模擬器)的OpenSSL 1.0.2g二進制文件。他們沒有在谷歌Play商店顯示安全警告:

http://www.delphipraxis.net/188736-kompilierte-openssl-bibliotheken-fuer-android.html

OpenSSL 1.0.2g Android.zip

OpenSSL 1.0.2g iOS Simulator.zip


更新:加入OpenSSL 1.0.2g了Android二進制文件現已上市在Embarcadero附件論壇:

https://forums.embarcadero.com/thread.jspa?threadID=211147

然後,加載OpenSSL的,而不是BoringSSL,請按照下列步驟操作:

  1. 2個.so文件添加到您的項目部署,並設定他們部署到.\assets\internal\文件夾

  2. System.StartupCopy單位作爲DPR的uses條款中的第一個單位。

  3. 在應用程序啓動時調用IdOpenSSLSetLibPath(TPath.GetDocumentsPath)


更新:OpenSSL的1.0.1t和1.0.2h二進制現在是在Embarcadero的附件論壇:

https://forums.embarcadero.com/thread.jspa?threadID=211147


更新:二進制有現已發佈在Indy的Fulgan鏡子上:

http://indy.fulgan.com/SSL/

+1

謝謝雷米!我正在使用Android 6棉花糖。到現在爲止,我不得不找出解決問題的另一種解決方法,但我肯定會在將來再次面對這個問題,並且您的答案會有所幫助。 – wordermorr

+0

感謝您的更新! – wordermorr

+0

我很沮喪,我很生氣,我很絕望。我討厭Google這樣做。我討厭Embarcadero沒有選擇在Android 6上使用SSL/TLS(這是今天的死刑......應用程序沒有網絡加密?你好?)。我一直在用Delphi來努力的一個原因。總是有這麼大的問題。另一方面,我明白Google的決定背後的重點是讓一切都通過他們的操作系統。德爾福總是很特別(不是原生的等)。更多的是,我很高興有像雷米這樣有幫助的人和發現這些文件的人。至少谷歌正確地稱他們的叉子:BoringSSL。 – StanE

0

有32/64位的版本。 確保你有正確的文件版本。

請參閱this FTP瞭解正確的版本。

下載二進制文件的其他鏡像here