【问题标题】:Http Post Indy10 Error Delphi 7: Error creating SSL contextHttp Post Indy10 错误 Delphi 7:创建 SSL 上下文时出错
【发布时间】:2019-03-21 18:01:12
【问题描述】:

我正在使用带有 Indy 10.6.2.5459 的 Delphi 7 不时向服务器发出 POST 请求:

sParams := '?ultimaAlteracao='+FormatDateTime('YYYY-MM-DD',now())+'T00:00:00.000';
FidHTTP := TIdHTTP.Create;
try
  FidHTTP.Request.Clear;
  FidHTTP.Request.Accept           := 'application/json;charset=UTF-8';
  FidHTTP.Request.CharSet          := 'UTF-8';
  FidHTTP.Response.ContentType     := 'application/json;charset=UTF-8';
  FidHTTP.Response.ContentEncoding := 'UTF-8';
  FidHTTP.Request.CustomHeaders.AddValue('Authorization','Basic '+EncodeBase64('xx:xx@123456'));

  JsonStream := TStringStream.Create('');
  JsonStream.Position := 0;
  try
    FidHTTP.Get('https://'+server+'/LinxImportacaoArquivo/GetSelecaoDadosMDMNCM'+sParams, JsonStream);
    DataString := JsonStream.DataString;
  finally
    FreeAndNil(JsonStream);
  end;
finally
  FreeAndNil(FidHTTP);
end;

一段时间后,它开始失败并返回:

创建 SSL 上下文时出错。错误:140A90F1:SSL 例程:SSL_CTX_new:无法加载 ssl2 md5 例程

如果我重新启动应用程序,它会再次运行一段时间。 我发现一些人有同样的问题:herehere

据我所知,可能是其他进程使用 Indy 发出干扰请求,我引用

这似乎是某种类型的静态成员的问题 openssl 库中的初始化。我有 2 个图书馆,两者都是 他们使用 openssl 库,我们称他们为 A 和 B。当 应用程序启动 A & B 都能够成功创建一个 安全上下文。后来,当图书馆 B 试图创建另一个 安全上下文失败。库 A 和 B 都是模块插件 我们的应用程序,所以它们都将加载,但如果不需要,它是 已卸载。

确实,我的应用程序有很多其他进程正在执行,通过 indy10 或 WinInet 发出 http 请求。

所以,我的问题是:我可以在 Indy10 上调用一些程序来使其初始化一些可以在 opensll 库上释放的东西吗?

【问题讨论】:

  • 附带说明,您不应使用TIdHTTP.Request.CustomHeaders 属性手动发送Basic 身份验证凭据。设置TIdHTTP.Request.BasicAuthentication=true 并改用TIdHTTP.Request.UsernameTIdHTTP.Request.Password 属性。而UTF-8 不是有效的ContentEncoding。并且在接收字符串响应时,您应该使用返回stringTIdHTTP.Get() 的重载而不是填充TStream 的重载,让TIdHTTP 为您处理响应的字符集:DataString := FidHTTP.Get(url);

标签: post openssl delphi-7 indy10


【解决方案1】:

我发现在 IdSSLOpenSSL 单元有一个名为 UnLoadOpenSSLLibrary 的过程。 如果我总是在我的代码之前调用该过程,则不会发生错误。

【讨论】:

  • Indy 不会多次卸载和重新加载 OpenSSL,一旦加载它就会保持加载状态(除非你手动卸载它),所以这个问题真的不应该首先发生,除非你使用 Indy在一个包中,并且该包被多次卸载和重新加载。加载 OpenSSL 后卸载它确实不是一个好主意,因为这样做存在内部问题,它确实不是一个卸载安全的库。
  • @RemyLebeau 太糟糕了,因为我在尝试使用 SSL 通过 SMTP 发送第二多封电子邮件时遇到了同样的错误。这个解决方案解决了这个问题......现在。
猜你喜欢
  • 2018-05-20
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多