編碼:
TIdSSLIOHandlerSocketOpenSSL( ASMTP.IOHandler ).SSLOptions.SSLVersions := [sslvSSLv2,sslvSSLv23,sslvSSLv3,sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
似乎問題出在方法 TIdSSLOptions.SetSSLVersions 中,如果您設定的不是單一版本,它會設定fMethod := sslvSSLv23. 如果不可用,TIdSSLContext.SetSSLMethod 回傳 nil 并且您會收到此錯誤。
Indy Dec-2015,TIdSSLContext.SetSSLMethod 可以回傳 nil。解決方案已恢復。
uj5u.com熱心網友回復:
問題是什么?沒有,希望有人覺得這有用。
這是一個問答網站。分享知識可以,但必須是問答形式。請參閱我可以回答我自己的問題嗎?
無論如何,這聽起來更像是應該報告給Indy 的問題跟蹤器而不是公共論壇的錯誤報告。
也就是說,您根本不應該啟用 SSLv2 或 SSLv3 協議,因為它們不再安全,甚至在許多 OpenSSL 版本中不再可用。而 SSLv23 只是一個通配符,它??意味著只能在Method屬性中使用,而不是在SSLVersions屬性中使用(事實上,如果你試圖用任何其他版本指定它,它只會被忽略)。您應該只使用 中的 TLSv1 協議SSLVersions,讓 Indy 根據需要在內部處理 SSLv23。
TIdSSLIOHandlerSocketOpenSSL( ASMTP.IOHandler ).SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]
似乎問題出在方法 TIdSSLOptions.SetSSLVersions 中,如果您設定的不是單一版本,它會設定 fMethod := sslvSSLv23。
應該是這樣,因為 SSLv23 方法是 OpenSSL 在 SSL/TLS 握手期間啟用動態版本協商的方式,允許客戶端和服務器協商它們都支持的最高 TLS 版本。否則,如果客戶端僅使用特定版本,而服務器不支持該版本,則 TLS 握手將失敗。
如果不可用,TIdSSLContext.SetSSLMethod 回傳 nil 并且您會收到此錯誤。
首先,SetSSLMethod()永遠不會nil回到SSL_CTX_new()。如果 OpenSSL 不支持請求的方法,則SetSSLMethod()引發EIdOSSLGetMethodError例外。
其次,這種情況意味著您無法執行版本協商,因此您必須改用特定的 TLS 版本。例外是設計使然,讓您知道您要求協商,但您的 OpenSSL 版本不支持它,因此請嘗試其他方法。
最簡單的解決方法是在設定 SSLVersions 之后設定 Method
Method和SSLVersions屬性是互斥的,設定一個會更新另一個。但是,Method已棄用,您真的應該只使用SSLVersions,即使對于單個 TLS 版本也是如此。
這可能也不存在,所以更好的解決方法可能在 indy 中:
當請求 SSLv23 時,您的解決方法會完全禁用版本協商。對于 Indy 來說,這不是一個可行的選擇。
真正的解決方法是讓您自己的代碼EIdOSSLGetMethodError在 SSLv23 不可用時捕獲例外,然后您可以根據需要使用單個 TLS 版本重新嘗試連接。為此不需要更改 Indy 的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/536566.html
標籤:德尔福打开SSL印地
