首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Delphi通过Indy TidHTTP (htttps)连接TidHTTP错误

Delphi通过Indy TidHTTP (htttps)连接TidHTTP错误
EN

Stack Overflow用户
提问于 2022-11-17 00:26:40
回答 2查看 56关注 0票数 1

我很难通过TIdHTTP连接到我的TIdHTTP账户,我不知道该怎么做了。我想在第一阶段向DropBox发送一个简单的文本文件。

代码语言:javascript
运行
复制
procedure TForm2.btn1Click(Sender: TObject);
const
  API_URL = 'https://content.dropboxapi.com/2/files/upload';
  cFile   = 'D:\testfile.txt';
var
  wAccessToken : string;
  Source: TFileStream;
  IdHTTP: TIdHTTP;
  Res : string;
  Ssl: TIdSSLIOHandlerSocketOpenSSL;
begin
  wAccessToken := 'muj_token';
  IdHTTP := TIdHTTP.Create(nil);
  try
    (*
    ShowMessage('Indy version: ' + IdHTTP.Version);
    RESULT MESSAGE : INDY 10.5.9.0
    *)
    IdHTTP.HandleRedirects := True;
    ssl := TIdSSLIOHandlerSocketOpenSSL.Create();
    ssl.SSLOptions.Method := sslvTLSv1_2;
    ssl.SSLOptions.Mode := sslmUnassigned;
    ssl.SSLOptions.VerifyMode := [];
    ssl.SSLOptions.VerifyDepth := 0;
    ssl.host := '';

    Source := TFileStream.Create(cFile, fmOpenRead);

    IdHTTP.IOHandler := ssl;
    IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + wAccessToken;
    IdHTTP.Request.CustomHeaders.Values['Dropbox-API-Arg'] :=
           '{ "autorename": false,"mode": "add","mute": false,"path": "/test.txt","strict_conflict": false}';
    IdHTTP.Request.CustomHeaders.Values['Content-Type']  := 'application/octet-stream';

    Memo1.Lines.Add(IdHTTP.Request.CustomHeaders.Text);

    Res := IdHTTP.Post(API_URL, Source);

  finally
      IdHTTP.Free;
  end;

但是,在POST命令之后,我得到了错误:

Project2.exe引发异常类EIdOSSLUnderlyingCryptoError,其消息为“与SSL连接错误:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1警报协议版本”。

我不知道该怎么做,哪里有个愚蠢的错误。我在StackOverflow上发现了类似的问题:

TIdHTTP in Indy 10

Post problems with Indy TIdHTTP

还有很多其他论坛。在某个地方,它说它可能是一个旧的Indy (它是这样的),但是DropBox可能需要TLS v1.2,尽管TIdHTTP启用了它:

ssl.SSLOptions.Method := sslvTLSv1_2

对于请求跟踪,我坚持DropBox的API结构:

代码语言:javascript
运行
复制
DROPBOX API DOCUMENTATION
     https://www.dropbox.com/developers/documentation/http/documentation#files-upload
     Get access token for:
     ****************************************************** **************
     curl -X POST https://content.dropboxapi.com/2/files/upload \
     --header "Authorization: Bearer <get access token>" \
     --header "Dropbox-API-Arg: {\"autorename\":false,\"mode\":\"add\",\"mute\":false,\"path\":\"/Homework/ math/Matrices.txt\",\"strict_conflict\":false}" \
     --header "Content-Type: application/octet-stream" \
     --data-binary @local_file.txt
     ****************************************************** **************

更多的信息:

10.5.9.0

  • with
  • Delphi XE3
  • Indy -- exe我有OpenSSL文件libeay32.dll (1.0.2.17)和ssleay32.dll (1.0.2.17) --但这不是它。如果我将它们丢弃,错误是same.
  • DropBox需要TLS1.2,自4月份以来,

在一些论坛上,他们用旧的OpenSSL文件,即旧的Indy文件编写了相同的错误,通过TLS发送,收件人不支持这个错误。但我也没有任何感觉。

我从https://github.com/IndySockets/OpenSSL-Binaries下载了https://github.com/IndySockets/OpenSSL-Binaries

openssl-1.0.2u-x64_86-win64.zip (我不知道它是否好,表中有一堆不同的名称"r","s","t","u",我选择了最后一个)。

EN

Stack Overflow用户

发布于 2022-11-18 01:17:12

错误是抱怨“协议版本”不被接受。即使您将版本设置为TLS1.2,Indy或OpenSSL很可能会回到TLS1.0或1.1,如果服务器实际需要TLS1.2,则会失败。

另外,还要考虑的是--即使TLS 1.2被正确使用,现在大多数TLS 1.2服务器也需要客户端使用SNI扩展在TLS握手中发送请求的主机名(因此可以使用适当的证书),但是Indy 10.5.9不支持SNI。因此,升级到最新的印地版本将获得您的这一功能。

即使您不更新Delphi/Indy,至少应该确保您使用的是更新的OpenSSL。Indy10.6.2官方支持的最后一个版本是1.0.2u (1.0.2.21)。如果您想尝试一下,对OpenSSL 1.1+/3.0的支持是一个WIP (https://github.com/IndySockets/Indy/pull/299)。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74468794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档