无法通过编程方式从Amazon CDN下载文件的问题求助
从Amazon CDN下载文件失败问题排查
我使用URLDownloadToFile下载文件通常运行正常,但尝试从Amazon CDN下载URL为https://download.datanumen.com/downloads/file/dexr.exe的文件时始终失败,手动通过Chrome或Firefox可以正常下载。
初始C++实现代码
// Delete the cache before calling URLDownloadToFile DeleteUrlCacheEntry(strURL); HRESULT hr; hr = URLDownloadToFile(NULL, strURL, strFileName, 0, NULL); if (hr == INET_E_DOWNLOAD_FAILURE) hr = hr; if (hr != S_OK) { _com_error err(hr); _tprintf(_T("Error in download: %s.\n"), err.ErrorMessage()); } IStream* stream; hr = URLOpenBlockingStream(0, LPCTSTR(strURL), &stream, 0, 0); if (hr != S_OK) { _com_error err(hr); _tprintf(_T("Error in download: %s.\n"), err.ErrorMessage()); } return (hr == S_OK);
运行错误信息
Error in download: Unknown error 0x800C0005. Error in download: Unknown error 0x800C0005.
由于返回未知错误,无法确定问题根源。
更新1:尝试Delphi代码下载
改用Delphi代码尝试下载该文件:
function DownloadFile(const strURL: string; const strFileName: string): Boolean; var IdHTTP1: TIdHTTP; http : TNetHTTPClient; Stream: TMemoryStream; Url, FileName: String; begin Url := 'http://www.rejbrand.se'; Filename := 'download.htm'; IdHTTP1 := TIdHTTP.Create(nil); http := TNetHTTPClient.Create(nil); Stream := TMemoryStream.Create; try //IdHTTP1.Get(strURL, Stream); http.Get(strURL, stream); Stream.SaveToFile(strFileName); finally Stream.Free; IdHTTP1.Free; end; end;
异常信息
- 使用TIdHTTP时:
Project DLVerify.exe raised exception class EIdOSSLUnderlyingCryptoError with message 'Error connecting with SSL. error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version'.
- 使用TNetHTTPClient时:
Project DLVerify.exe raised exception class ENetHTTPClientException with message 'Error sending data: (12175) A security error occurred'.
所有代码均无法成功下载该文件。
更新2:尝试指定多版本TLS/SSL
调整代码,指定多种SSL/TLS版本:
function DownloadFile1(const strURL: string; const strFileName: string): Boolean; var LHTTP: TIdHTTP; LHandler: TIdSSLIOHandlerSocketOpenSSL; responseFromServer, sWhichFail, sVer :string; Stream: TMemoryStream; begin //ResponseMemo.Clear; LHTTP := TIdHTTP.Create(nil); try LHandler := TIdSSLIOHandlerSocketOpenSSL.Create(LHTTP); LHandler.SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv23, sslvSSLv3, sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2]; LHandler.SSLOptions.Mode := sslmClient; LHandler.SSLOptions.VerifyMode := []; LHandler.SSLOptions.VerifyDepth := 0; LHTTP.IOHandler := LHandler; LHTTP.AllowCookies := True; Stream := TMemoryStream.Create; try //IdHTTP1.Get(strURL, Stream); LHTTP.Get(strURL, stream); Stream.SaveToFile(strFileName); finally Stream.Free; LHTTP.Free; end; end;
结果仍然失败,错误信息与之前一致。
更新3:仅保留TLS 1.1和1.2版本
修改SSL版本设置为仅启用TLS 1.1和1.2:
LHandler.SSLOptions.SSLVersions := [sslvTLSv1_1,sslvTLSv1_2];
得到新的错误:
Project DLVerify.exe raised exception class EIdOSSLUnderlyingCryptoError with message 'Error connecting with SSL. error:140740BF:SSL routines:SSL23_CLIENT_HELLO:no protocols available'.
内容的提问来源于stack exchange,提问作者alancc
相关产品推荐
相关产品推荐

