Indy не реализует SSL изначально. Он реализует гибкую архитектуру IOHandler, которая позволяет подключать любую версию SSL к Indy. Indy сам реализует собственный класс IOHandler, основанный на OpenSSL (поддержка MS CryptoAPI запланирована на будущее). SecureBlackbox, например, предоставляет класс Indy IOHandler для своего собственного механизма SSL.
На большинстве платформ OpenSSL используется через внешние библиотеки DLL, которые нельзя использовать из ресурсов. Indy не поставляется с DLL OpenSSL, поскольку шифрование OpenSSL ограничено международными законами об импорте/экспорте, поэтому у обоих поставщиков ОС, которые поставляются на международном уровне, есть специальные лицензии на отправку DLL OpenSSL, или конечным пользователям приходится самостоятельно загружать/компилировать OpenSSL самостоятельно. Именно это делает Indy «переносимым», когда дело доходит до OpenSSL. Indy использует любые DLL OpenSSL, предварительно установленные вне Indy, либо в ОС, либо в собственной папке установки вашего приложения.
Единственное исключение для Indy - OpenSSL на iOS, которое требует использования OpenSSL статически, потому что на устройствах iOS не допускаются сторонние динамические библиотеки.
Если вы хотите использовать OpenSSL статически с Indy на других платформах, вам нужно самостоятельно собрать/получить статическую версию OpenSSL и добавить его в свой проект, а затем перекомпилировать Indy, чтобы включить его определение STATICLOAD_OPENSSL
(которое в настоящее время определено только для iOS) и, наконец, включите блок IdSSLOpenSSLHeaders_static.pas
в код uses
вашего кода, чтобы подключить необходимый код поддержки. Обратите внимание, что это поддерживается только в недавно выпущенной версии Indy 10.6.
Если это слишком много для вас, используйте стороннюю реализацию SSL, совместимую с Indy, такую как SecureBlackbox, или напишите свой собственный класс IOHandler, который сделает все, что вам нужно.
Как для других вопросов:
1) Инди делает вызывать исключения, если он не может загрузить OpenSSL правильно во время операций с сокетами. Таким образом, вероятность того, что эти исключения пойманы и проглочены, прежде чем вы сможете сообщить об этом своим пользователям. Если вы не хотите полагаться на это, вы можете вручную вызвать функцию Indys Load()
в блоке IdSSLOpenSSLHeaders.pas
перед началом работы сокета. Load()
загрузит OpenSSL в память, если он еще не загружен.Если Load()
не работает, вы можете вызвать функцию WhichFailedToLoad()
в том же блоке, чтобы узнать, почему Load()
не удалось.
2) Нет, OpenSSL нельзя использовать из ресурсов (без какой-либо действительно серьезной низкоуровневой хитрости).
Большое спасибо! Это очистило все для меня. –
Почему Indy не реализует SSL изначально? Все страдают из-за необходимости использования этих внешних dll. –
Было бы серьезным обязательством внедрить SSL изначально. Зачем тратить время и силы, когда другие уже реализуют реализации? В любом случае я упомянул, что мы планируем создать оболочку IOHandler для CryptoAPI, чтобы решить проблемы с DLL и проблемы импорта/экспорта в Windows, поскольку она встроена в ОС. На других платформах обычно используется OpenSSL. –