在使用Delphi 10.4编译我的Win32客户端/服务器应用程序(使用INDY和TMS Sparkle)后,我遇到了SSL错误。我在服务器端使用Indy和自签名证书,在客户端也是如此。错误信息为“连接 SSL 错误。违反协议遇到 EOF。”。
我没有更改任何代码或环境,而在Delphi 10.3中它运行得很完美。我可以将问题归结为服务器端,因为旧服务器(在10.3中编译)与新客户端(在10.4中编译)一起运行,但旧客户端在尝试连接到新服务器时也会出现错误。
这是我初始化SSL的方式:
SecureServer := TIndySparkleHTTPServer.create(nil);
SecureServer.DefaultPort := SecurePort;
// Initialize SSL with self signed certificate
SSLHandler := TIdServerIOHandlerSSLOpenSSL.create(SecureServer);
SSLHandler.SSLOptions.CertFile := SharedVals.ServerPath + 'appcert.pem';
SSLHandler.SSLOptions.RootCertFile := SharedVals.ServerPath + 'approot.pem';
SSLHandler.SSLOptions.KeyFile := SharedVals.ServerPath + 'appkey.pem';
SSLHandler.SSLOptions.Method := sslvSSLv23;
SecureServer.IOHandler := SSLHandler;
Emba在10.3中成功突破了Indy,也许这是另一个类似的案例?
SSLOptions.Method
属性,而应改用SSLOptions.SSLVersions
属性,例如SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSvTLSv1_2];
。 - Remy LebeauTIdHTTPServer
或其使用OpenSSL的功能没有任何已知问题。 - Remy LebeauTIdHTTPServer
接收到格式错误的HTTP请求时,会引发EIdHTTPErrorParsingCommand
异常。由于TIdHTTPServer
在完成SSL/TLS握手之后才处理解密的HTTPS请求,这意味着您的服务器实际上根本没有尝试执行SSL/TLS握手,因此正在尝试将客户端的SSL/TLS握手请求解析为HTTP请求。您的SecurePort
是否设置为非标准的HTTPS端口(而不是443)?如果是,请确保您的服务器具有一个OnQuerySSLPort
事件处理程序,该处理程序返回该端口的VUseSSL=True
。 - Remy Lebeau