You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 64位下Delphi 11 FMX应用AWS SMTP TLS1.2认证失败求助

Delphi 11 FMX Android 64位 TLS1.2 下TIdSMTP Authenticate报RSA签名错误的解决思路

问题描述

我开发了一款Delphi 11 FMX应用,此前使用TLS 1.0连接AWS SMTP服务。切换为TLS 1.2后,Win32、Win64和Android 32位平台均能正常工作,但Android 64位平台调用TIdSMTP组件的Authenticate方法时出现错误:

Project XXXXXXXXXXX raised exception class EIdOSSLUnderlyingCryptoError with message 'Error connecting with SSL.
error:04091068:rsa routines:INT_RSA_VERIFY:bad signature'.

相关代码

aSmtp.Username := SmtpUsername;
aSmtp.Password := SmtpPassword;
aSmtp.Host := SmtpHost;
try
    try
        if not aSmtp.Connected then
            aSmtp.Connect;
        aSmtp.Authenticate;
        aSmtp.Send(aEmailMsg);
    except on E: Exception do
        TUtils.Log('TViewmodelEmails.DoSendEmail error: ' + E.Message);
    end;
finally
    if aSmtp.Connected then
        aSmtp.Disconnect;
end;

SMTP组件配置

object SMTP: TIdSMTP
    IOHandler = IdSSLIOHandlerSocketOpenSSL1
    Port = 587
    SASLMechanisms = <>
    UseTLS = utUseExplicitTLS
    Left = 319
    Top = 568
end

IOHandler配置

object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
    Destination = ':587'
    MaxLineAction = maException
    Port = 587
    DefaultPort = 0
    SSLOptions.Method = sslvTLSv1_2
    SSLOptions.SSLVersions = [sslvTLSv1_2]
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 199
    Top = 568
end

使用的是EseGeCe提供的OpenSSL库,同时EseGeCe的WebSocket组件在Android 64位及其他平台均能正常工作。


解决方向

  • 检查Android 64位的OpenSSL库完整性
    尽管WebSocket组件正常,但SMTP的加密调用路径可能不同。确认部署到Android 64位的libcrypto.so和libssl.so是适配TLS1.2的64位专属版本,未与32位库混用,且文件无损坏。

  • 调整SASL认证机制配置
    当前SASLMechanisms为空,AWS SMTP支持LOGIN、CRAM-MD5等机制。尝试显式添加LOGIN机制:

    SMTP.SASLMechanisms.Add('LOGIN');
    

    或设置AuthType := satDefault,让Indy自动协商合适的认证方式,避免底层RSA签名验证冲突。

  • 明确SSL客户端模式
    将SSLOptions.Mode从sslmUnassigned改为sslmClient:

    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmClient;
    

    明确客户端身份可修复签名验证时的上下文异常。

  • 验证服务器证书与设备时间
    确认Android 64位设备系统时间准确(证书验证依赖时间),临时开启SSL验证测试:

    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyMode := [sslvrfPeer];
    IdSSLIOHandlerSocketOpenSSL1.SSLOptions.VerifyDepth := 3;
    

    若出现证书错误,需导入AWS根证书到应用的证书信任链中。

  • 更新Indy组件版本
    Delphi 11自带的Indy可能存在Android 64位下TLS1.2的兼容性bug,尝试替换为最新版本的Indy组件,修复平台特定的加密实现问题。


内容的提问来源于stack exchange,提问作者David U

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 06:00:17