Android 64位下Delphi 11 FMX应用AWS SMTP TLS1.2认证失败求助
问题描述
我开发了一款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

