我很难通过TIdHTTP
连接到我的TIdHTTP
账户,我不知道该怎么做了。我想在第一阶段向DropBox发送一个简单的文本文件。
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上发现了类似的问题:
Post problems with Indy TIdHTTP
还有很多其他论坛。在某个地方,它说它可能是一个旧的Indy (它是这样的),但是DropBox可能需要TLS v1.2,尽管TIdHTTP
启用了它:
ssl.SSLOptions.Method := sslvTLSv1_2
对于请求跟踪,我坚持DropBox的API结构:
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
libeay32.dll
(1.0.2.17)和ssleay32.dll
(1.0.2.17) --但这不是它。如果我将它们丢弃,错误是same.在一些论坛上,他们用旧的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",我选择了最后一个)。
发布于 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)。
https://stackoverflow.com/questions/74468794
复制相似问题