簡體   English   中英

Indy 10和OpenSSL

[英]Indy 10 and OpenSSL

我最近將我的Delphi 7升級到了Delphi XE2,我對它有點新意。 我使用Indy 10和OpenSSL來接收HTTP內容。 它運作得很好,我想與其他人分享我的程序。 我剛剛發現,如果沒有OpenSSL庫,我的程序將無法在其他PC上運行。 我甚至沒有得到丟失的DLL文件的異常,錯誤等。 我認為Indy10具有本機SSL支持或者至少在編譯后使用資源中的DLL,因此它是可移植的。 我有兩個問題:

1)我怎樣才能讓用戶知道他/她錯過了OpenSSL庫? (我的朋友報告沒有異常,錯誤等,沒有OpenSSL DLL。)

2)是否可以讓Indy10從資源中讀取OpenSSL庫?

Indy本身不實現SSL。 它的作用是實現靈活的IOHandler架構,允許將任何SSL實現插入到Indy中。 Indy本身實現了自己的基於OpenSSL的IOHandler類(MS CryptoAPI支持計划在未來使用)。 例如,SecureBlackbox為其自己的SSL引擎提供了Indy IOHandler類。

在大多數平台上,OpenSSL通過外部DLL使用,不能從資源中使用。 Indy沒有附帶OpenSSL DLL,因為OpenSSL加密受到國際進口/出口法律的限制,因此國際運輸的OS供應商都有運送OpenSSL DLL的特殊許可,或者最終用戶必須在本地下載/編譯OpenSSL。 這就是Indy在OpenSSL上“便攜”的原因 - Indy使用在Indy之外預裝的任何OpenSSL DLL,無論是在操作系統中還是在應用程序自己的安裝文件夾中。

關於Indy的唯一例外是iOS上的OpenSSL,它要求靜態使用OpenSSL,因為iOS設備上不允許使用第三方動態庫。

如果你想在其他平台上靜態使用OpenSSL,你必須自己編譯/獲取OpenSSL的靜態版本並將其添加到你的項目中,然后重新編譯Indy以啟用它的STATICLOAD_OPENSSL定義(目前只為iOS定義),最后在代碼的uses子句中包含IdSSLOpenSSLHeaders_static.pas單元以連接必要的支持代碼。 請注意,僅在最近發布的Indy 10.6版本中支持此功能。

如果這對您來說太多工作,那么請使用與Indy兼容的第三方SSL實現,例如SecureBlackbox,或者編寫您自己的IOHandler類,以滿足您的需要。

至於你的其他問題:

1)如果在套接字操作期間無法正確加載OpenSSL,Indy 引發異常。 因此,在您有機會向用戶報告之前,很可能會遇到並吞下這些異常。 如果您不想依賴它,那么您可以在開始套接字工作之前手動調用IdSSLOpenSSLHeaders.pas單元中的Indy的Load()函數。 如果尚未加載, Load()會將OpenSSL加載到內存中。 如果Load()失敗,則可以在同一單元中調用WhichFailedToLoad()函數以找出Load()失敗的原因。

2)不,不可能從資源中使用OpenSSL(沒有一些非常嚴重的低級欺騙)。

1)嘗試在調用Indy之前自己加載e DLL,如果LoadLibrary失敗,則可以引發異常。

2)你可以,看看這個:

在Delphi應用程序中直接從內存加載DLL資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM