如何向 Delphi WinSock HTTP 上传应用程序添加 HTTPS 支持?

Posted

技术标签:

【中文标题】如何向 Delphi WinSock HTTP 上传应用程序添加 HTTPS 支持?【英文标题】:How can I add HTTPS support to a Delphi WinSock HTTP upload application? 【发布时间】:2011-10-28 17:11:15 【问题描述】:

在商业 Delphi 库中,WinSock API 函数(如 WinSock.connect 和 WinSock.send)用于将文件上传到 HTTP 服务器。有没有办法支持HTTPS?我找到了http://www.rohitab.com/discuss/topic/36630-ssl-through-winsock/,上面写着:

您需要选择以下方法之一:

A.使用 WinINet 库。 乙。使用普通套接字和 WinCrypt 的 RSA 支持来匹配 SSL 规范。 C.使用 openssl 或其他库。

【问题讨论】:

【参考方案1】:

是的,当然。到目前为止,对您来说最简单的方法是使用 WinInet,因为他会为您完成所有必需的 SSL 握手。

在套接字之上实现 SSL 肯定是可行的,但会(很多)工作。如果您走这条路,我建议您使用 OpenSSL;这就是我们过去在手动滚动 SSL 时使用的方法。

只是在这里抛出这个:另一种方法,如果您拥有客户端和服务器端并且由于某种原因不能使用 Wininet,则在上传之前加密客户端上的文件。在没有 SSL 的情况下,您仍然会遇到相同的漏洞(例如,流量嗅探、中间人、重放攻击等),但至少文件数据是安全的……前提是您的加密密钥本身没有传输。

有使用 Delphi 的 Wininet 的 SO 示例;见How to send a HTTP POST Request in Delphi using WinInet api

【讨论】:

【参考方案2】:

HTTPS 很容易在 Delphi 中使用 Indy 的 TIdHTTP 和 TIdSSLIOHandlerSocketOpenSSL 组件以及 OpenSSL 实现。您将依赖于包含 OpenSSL 库。

还有原生的 Delphi 解决方案,例如 Eldos 的 SecureBlackBox 和 N Software 的 IPWorks SSL。

只要您有所需的组件,实现您自己的并不难。如果您不需要支持 TLS 和 SSL 标准,您甚至可以很容易地制作自己的替代品,但您仍然需要某种形式的非对称和对称加密算法以及一种验证证书的方法,如果您想要的话做一些加密安全的事情。

【讨论】:

【参考方案3】:

添加到您(可能已弃用)的 HTTPS 兼容解决方案列表中:

D.使用 WinHTTP api 而不是 WinINet。

WinHttp 和 WinINet API 非常接近。 但是 WinHttp 比 WinINet 快很多。

这里是how Microsoft defines WinHTTP:

Microsoft Windows HTTP 服务 (WinHTTP) 为开发人员提供了一个 到 HTTP/1.1 Internet 的服务器支持的高级接口 协议。 WinHTTP 主要用于基于服务器的 与 HTTP 服务器通信的服务器应用程序的场景。

WinINet 被设计为一个 HTTP 客户端平台,用于交互 桌面应用程序,例如 Microsoft Internet Explorer、Microsoft Office 和 Microsoft Money。 WinINet 显示用户界面 一些操作,例如收集用户凭据。然而,WinHTTP 以编程方式处理这些操作。服务器应用程序 要求 HTTP 客户端服务应该使用 WinHTTP 而不是 WinINet。 有关详细信息,请参阅将 WinINet 应用程序移植到 WinHTTP。

WinHTTP 还设计用于系统服务和基于 HTTP 的 客户端应用程序。但是,需要的单用户应用程序 FTP 协议功能、cookie 持久性、缓存、自动 凭据对话处理、Internet Explorer 兼容性或 下层平台支持应考虑使用 WinINet。

您可以直接使用 WinHTTP COM 对象(通过后期绑定),或使用低级 API(非常接近 WinINet 之一)。参见例如our Open Source unit(Delphi 5 到 XE2)。此链接有一个优缺点表可供参考。

只是为了强调 WinHTTP 的兴趣:据我发现,Microsoft 的 WCF 实现将它用于所有 HTTP/1.1 通信(也可以查看我们相同单元中的 http.sys kernel mode for the Server side - 它也被使用由 WCF 提供)。

【讨论】:

以上是关于如何向 Delphi WinSock HTTP 上传应用程序添加 HTTPS 支持?的主要内容,如果未能解决你的问题,请参考以下文章

Winsock 连接不起作用

如何从主(winsock)向服务器发送消息?

用VB的Winsock来发送http请求头,请指教!

delphi如何向txt写数据

如何用UDP 实现服务器广播发送,并接收客户端点对点回复,用winsock实现,写出关键代码,谢谢~

如何在 Winsock 中发送文件(http 方式)