unpack6280 2024-08-13 17:08 采纳率: 100%
浏览 13
已结题

delphi 10 seattle 调https

dehphi 10 seattle
Indy版本:10.6.2.5298
SSL版本:OpenSSL 1.0.0d 8 Feb 2011
调https时出现以下错误 :


没有带证书报以下错误 :
First chance exception at $75460D72. Exception class EIdOSSLUnderlyingCryptoError with message
'Error connecting with SSL.
error:14094438:SSL routines:SSL3_READ_BYTES:tlsv1 alert internal error'.
Process Project1.exe (6288)

带有证书报:
First chance exception at $75460D72. Exception class EIdOSSLLoadingCertError with message
'Could not load certificate.
error:00000000:lib(0):func(0):reason(0)'.
Process Project1.exe (6288)


Method:sslvTLSv1_2 每一种都 试了
Mode:sslmClient 每一种都 试了
dll:ssleay32 我是官网1.0.0d 8 包里面的,应是没问题 的

不知道是服务器还需要配置什么还是我的SSL库有问题
请帮忙分析下原因,万分感谢!


procedure TForm_main.PostJSON(const AURL, AJSON: string);
var
  HTTP: TIdHTTP;
  JSONData: TStringList;
  Response: string;
begin
  HTTP := TIdHTTP.Create(nil);
  JSONData := TStringList.Create;
  try
     // 设置SSL/TLS选项
    HTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);

    TIdSSLIOHandlerSocketOpenSSL(HTTP.IOHandler).SSLOptions.Method := sslvTLSv1_2;// sslvTLSv1_2;
    TIdSSLIOHandlerSocketOpenSSL(HTTP.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1_2];//[sslvTLSv1_2];
    TIdSSLIOHandlerSocketOpenSSL(HTTP.IOHandler).SSLOptions.Mode := sslmClient;
    TIdSSLIOHandlerSocketOpenSSL(HTTP.IOHandler).SSLOptions.CertFile := 'cx.zdytsl.com_nginx\sycx.zdytsl.com.pem'; // 客户端SSL证书文件路径
    TIdSSLIOHandlerSocketOpenSSL(HTTP.IOHandler).SSLOptions.KeyFile := 'cx.zdytsl.com_nginx\sycx.zdytsl.com.key'; // 客户端SSL证书私钥文件路径
    //TIdSSLIOHandlerSocketOpenSSL(HTTP.IOHandler).SSLOptions.RootCertFile := 'cx.zdytsl.com_nginx\sycx.zdytsl.com.pem'; // CA根证书文件路径
    HTTP.HandleRedirects := true;
    // 将JSON字符串添加到TStringList
    JSONData.Text := AJSON;
    // 发送POST请求
    Response := HTTP.Post(AURL, JSONData);
    // 处理响应
    ShowMessage(Response);
  finally
    JSONData.Free;
    HTTP.Free;
  end;
end;

  • 写回答

23条回答 默认 最新

  • 专家-皆知 2024-08-13 17:09
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    遇到您描述的问题,通常涉及到SSL连接的配置不正确或SSL库与服务器要求的协议版本不兼容。根据您提供的错误信息,这里有几个可能的原因和解决步骤:

    无证书时的错误:

    • 错误信息: error:14094438:SSL routines:SSL3_READ_BYTES:tlsv1 alert internal error

      这个错误通常意味着SSL握手过程中出现了内部错误,可能是由于SSL/TLS版本不匹配或加密套件不被接受。虽然您尝试了sslvTLSv1_2,但可能存在其他配置问题。

    带有证书时的错误:

    • 错误信息: Could not load certificate. error:00000000:lib(0):func(0):reason(0)

      这表明客户端证书或私钥文件未能正确加载。可能是文件路径错误、文件损坏、权限问题,或者是文件格式不被支持。

    解决方案步骤:

    1. 更新SSL库

    首先,您的OpenSSL版本1.0.0d非常陈旧,这可能是导致不兼容的主要原因之一。强烈建议更新到最新稳定版本(至少1.1.1以上),因为旧版本可能缺少对现代SSL/TLS协议的支持,比如TLS 1.2或更高版本。

    2. 检查证书和密钥文件

    • 确保CertFileKeyFile的路径是正确的,并且文件可读。
    • 检查证书和私钥是否匹配并且未损坏。您可以使用OpenSSL命令行工具验证它们:
      openssl x509 -in sycx.zdytsl.com.pem -text -noout
      openssl rsa -in sycx.zdytsl.com.key -check
      
    • 确保私钥没有密码保护,或者在Indy中提供了解密私钥的回调函数。

    3. 配置SSL选项

    调整您的SSL选项以适应更广泛的兼容性,例如:

    // 允许多个SSL版本,以确保最大的兼容性
    TIdSSLIOHandlerSocketOpenSSL(HTTP.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2, sslvTLSv1_3];
    
    • 如果服务器要求特定的加密套件或协议版本,请确保您的配置与其相匹配。

    4. 使用正确的证书链

    虽然您未明确设置RootCertFile,但在某些情况下,服务器可能需要验证完整的证书链。确保您的客户端也包含了必要的CA根证书或中间证书。

    5. 捕获并调试SSL错误

    为了更好地诊断问题,可以捕获SSL相关的异常,并打印详细的错误信息:

    on E: EIdOSSLCouldNotLoadSSLLibrary do
    begin
      ShowMessage('SSL Library Load Error: ' + E.Message);
    end;
    
    on E: EIdOSSLUnderlyingCryptoError do
    begin
      ShowMessage('SSL Crypto Error: ' + E.Message + '. Error Code: ' + IntToStr(E ErrorCode));
    end;
    
    on E: EIdOSSLLoadingError do
    begin
      ShowMessage('SSL Loading Error: ' + E.Message);
    end;
    

    6. 更新并编译 Indy

    确保您的Delphi项目使用的Indy组件也是最新版本,与新版本的OpenSSL库兼容。

    完成上述步骤后,重新测试您的应用。如果问题仍然存在,可能需要查看服务器日志以获取更多信息,或者联系服务器管理员确认服务器的SSL配置需求。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(22条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月16日
  • 已采纳回答 8月16日
  • 创建了问题 8月13日

悬赏问题

  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏
  • ¥15 以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。