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

时间:2011-10-28 17:11:15

标签: delphi ssl https winsock

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

  

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

     
      
  • 甲。使用WinINet库。
  •   
  • B中。使用普通套接字和WinCrypt的RSA支持来匹配SSL规范。
  •   
  • ℃。使用openssl或其他库。
  •   

3 个答案:

答案 0 :(得分:2)

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

在套接字之上实现SSL肯定是可行的,但会(更多)更多的工作。如果沿着这条路走下去,我建议OpenSSL;这就是我们过去使用SSL时所使用的。

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

有一些关于使用Delphi的Wininet的例子;见How to send a HTTP POST Request in Delphi using WinInet api

答案 1 :(得分:1)

使用Indy的TIdHTTP和TIdSSLIOHandlerSocketOpenSSL组件以及OpenSSL,可以在Delphi中轻松实现HTTPS。您将依赖于包含OpenSSL库。

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

只要您拥有所需的组件,实现您自己并不困难。如果您不需要支持TLS和SSL标准,您甚至可以轻松酿造自己的替换品,但是您仍然需要某种形式的非对称和对称加密算法以及如果您想要验证证书的方法做一些加密安全的事情。

答案 2 :(得分:1)

添加到您的(可能已弃用)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的内容:据我所知,微软的WCF实现将其用于所有的HTTP / 1.1通信(同样在我们的同一个单元中查看http.sys kernel mode for the Server side - 这是也被WCF使用。