- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近将我的 Delphi 7 升级到了 Delphi XE2,我对它还是个新手。我使用带有 OpenSSL 的 Indy 10 来接收 HTTP 内容。它工作得很好,我想与其他人分享我的程序。我刚刚发现如果没有 OpenSSL 库,我的程序将无法在其他 PC 上运行。我什至没有得到丢失 DLL 文件的异常、错误等。我认为 Indy10 要么具有 native SSL 支持,要么至少在编译后使用来自资源的 DLL,因此它是可移植的。我有两个问题:
1) 我怎样才能让用户知道他/她缺少 OpenSSL 库? (我的 friend 报告没有异常、错误等,没有 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 加密受到国际 import/export 法律的限制,因此在国际上发售的操作系统供应商都拥有运送 OpenSSL DLL 的特殊许可,或者最终用户必须自己在本地下载/编译 OpenSSL。这就是使 Indy 在涉及 OpenSSL 时“可移植”的原因 - Indy 使用在 Indy 之外预安装的任何 OpenSSL DLL,无论是在操作系统中还是在您的应用程序自己的安装文件夹中。
与 Indy 相关的唯一异常(exception)是 iOS 上的 OpenSSL,它要求静态使用 OpenSSL,因为 iOS 设备上不允许使用第三方动态库。
如果你想在其他平台上通过 Indy 静态使用 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(没有一些非常严重的低级欺骗)。
关于delphi - Indy 10 和 OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16367842/
我尝试使用SHA-256加密功能,但没有成功。 我需要获取字符串和文件的哈希值。我使用 Delphi 10.1 Berlin 和 Indy for Hash。 我的代码: uses System.Cl
是否有关于如何在 Lazarus 中安装 Indy 10 组件的分步指南? 我在 https://svn.atozed.com:444/svn/Indy10 查看了最后一个 snv 快照 用户名:In
我在 Delphi 7 中编写了一个程序(包括一个使用 Indy 的 ModBus 组件)。在我的机器上,它使用 Indy 9 并且工作正常。它通过 ModBus 协议(protocol)与其他机器进
我是 indy 新手,使用 CBuilder XE4 附带的任何版本。这是非常简单的代码,在我正在阅读的内容超过 16K 限制之前都可以正常工作...... String Ttcp_mgr::send
我在 4 个基于 ubuntu 的机器上设置了 4 个节点。我使用以下命令生成了这些节点所需的 key :init_indy_node VAL1 0.0.0.0 9701 0.0.0.0 9702 1
当前应用程序:Delphi 2006、indy9(大量使用 SOAP 和其他组件) 需要转到 Indy 10 以获得 TLS 支持(poodle 等)。 看着 http://www.indyproje
我是 C++ Builder 的新手。三天前,我安装了 Embarcadero®。 C++Builder® 2010。这门语言对我来说非常有趣。 在 Delphi 中,我通常使用 Indy 9 和 1
我对 SSL 和这些加密的东西完全陌生,但我需要让在移动设备上运行的客户端和服务器 Delphi XE6 应用程序进行通信。必须对 TCP 通信进行安全加密。 首先,我简单地编写了基于 Win32 客
我有三个问题: 是否可以通过多个连接破坏IdTCPServer? 我尝试测试我的应用程序,并且当我有多个连接时 - 它工作得很好(甚至几天),但是当有时连接数增加时,应用程序会导致访问冲突。我写的应用
我使用 Delphi XE 5/6,默认 Indy 版本,Windows 7。IdMappedPortTCP(放在表单上的组件)将本地流从 FFmpeg 重定向到 Twitch.tv,并且总是接近 2
我有一个客户端应用程序,它应该向可选的服务器应用程序发送通知消息。客户端不应受到服务器应用程序是否存在的影响。它应该尝试连接到服务器应用程序并发送通知消息,如果出现错误,它应该默默地忽略所有错误并继续
我在使用Indy(idTCPServer组件)读取客户端发送的数据时遇到一些问题,数据本身是十六进制格式的,所以我不能使用AThread.Connection.ReadLn( );为此... 这是我的
当Indy收到404时,我无法获取响应内容,它总是空的。 例如使用Indy访问https://www.etsy.com/people/car ,我收到 404 并且内容流(或分配的流)只是空的。对TH
很久以前,我使用 Delphi 2007 和 WebBroker (TWebModule) 启动了一些“Web 应用程序”。当时我假设您需要一个 Web 服务器(例如 Apache 或 Microso
这是我的程序: Application.FTP.Host:= vHost; Application.FTP.Port:= vPort; try Application.FTP.AutoLogin
以下代码请求 OAuth2 token 。它适用于 Indy 10.0.52,但对于 Indy 10 SVN 5412,由于请求凭据无效,它会生成 400 Bad Request 错误。 WXYZUs
我有一个应用程序需要从网络驱动器进行一些 FTP 上传。我为此使用 Indy。然后,当文件位于网络驱动器上并成功上传到 FTP 服务器时,我想通过电子邮件将同一文件发送给同事。 我正在使用下面的代码来
我正在使用 Indy UDP Server 读取一串数据。但是,我真的不知道如何使用 Adata 参数。我可以通过使用下面的 ByteToBin 函数将其转换为二进制,然后使用 BintoHex1 将
我是独立服务器的新手,所以我正在努力完成这个简单的任务。我必须创建一个服务器并上传一个小文件;它的大小始终为 128 字节。然后,当有人打开服务器主页时,文件会自动发送。所以: 在磁盘上上传一个文件(
我正在使用 Delphi 10.0 西雅图。 我想向 UDP 服务器发送请求,然后读取服务器响应,这是一个简单的字符串: Client side:send('12345') server side(o
我是一名优秀的程序员,十分优秀!