Oracle 19c下UTL_SMTP用STARTTLS和Wallet遇ORA-29024错误排查
Oracle 19c UTL_SMTP STARTTLS 证书验证问题排查与配置
迁移背景
将旧的Oracle send_mail存储过程迁移至Oracle Database 19c(19.0.0),目标是通过587端口使用带认证的STARTTLS SMTP服务。
核心目标
通过UTL_SMTP向要求TLS加密与身份认证的SMTP服务器发送邮件。
已完成操作
- 运行环境:Oracle 19c(19.0.0)
- 已为SMTP连接启用Wallet功能
- 已实现STARTTLS与身份认证逻辑框架
- 已成功建立与SMTP服务器的未加密连接
- 已从SMTP主机下载证书,并通过
orapki工具添加至Oracle Wallet
当前问题
Wallet加载正常,但调用utl_smtp.starttls(mail_conn)时触发错误:
ORA-29024: Certificate validation failure - continuing without TLS
相关代码片段
mail_conn := utl_smtp.open_connection( host => k_smtp_host, port => k_smtp_port, wallet_path => k_wallet_path, wallet_password => k_wallet_password ); utl_smtp.ehlo(mail_conn, k_smtp_host); BEGIN utl_smtp.starttls(mail_conn); -- 此处执行失败 utl_smtp.ehlo(mail_conn, k_smtp_host); -- 需要第二次EHLO EXCEPTION WHEN OTHERS THEN raise_application_error(-20001, 'STARTTLS failed: ' || SQLERRM); END; -- 后续为AUTH LOGIN与邮件发送逻辑...
Wallet中的受信任证书
- Subject: CN=Thawte TLS RSA CA G1, OU=www.digicert.com, O=DigiCert Inc, C=US
- Subject: CN=DigiCert Global Root G2, OU=www.digicert.com, O=DigiCert Inc, C=US
技术疑问解答
1. Oracle Wallet中需要包含哪些具体证书?是否需要服务器证书,还是仅需中间证书与根证书?
不需要直接添加SMTP服务器的证书,Wallet只需包含完整的信任链证书:即SMTP服务器证书的签发中间CA证书,以及最终的根CA证书。Oracle会在TLS握手时自动验证服务器证书是否由Wallet中信任的CA签发。
如果SMTP服务器使用自签名证书,则必须将该自签名证书添加到Wallet的信任列表中。
2. 如何验证Wallet内的证书链完整且有效?
可通过以下步骤验证:
- 使用
orapki命令查看Wallet内所有证书,确认信任链层级(根CA → 中间CA)完整:orapki wallet display -wallet /path/to/wallet -pwd wallet_password - 提取SMTP服务器的完整证书链(通过
openssl s_client -connect smtp_host:587 -starttls smtp命令获取),对比Wallet中的证书是否覆盖链中的所有CA节点(根和中间)。 - 检查所有信任证书的有效期,确保未过期。
3. 有没有方法在utl_smtp.starttls执行期间详细检查或调试TLS协商过程?
可通过以下方式开启调试:
- 在数据库服务器的
sqlnet.ora中添加参数,开启UTL_SMTP的详细跟踪:
重启监听后执行DIAG_ADR_ENABLED=ON TRACE_LEVEL_SERVER=16 TRACE_FILE_SERVER=utlsmtp_trace.trc TRACE_DIRECTORY_SERVER=/path/to/trace/dir SSL_TRACE_LEVEL=16utl_smtp.starttls,查看生成的跟踪文件,里面包含TLS握手步骤、证书验证的具体错误信息(如证书未被信任、链不完整等)。 - 使用
openssl模拟TLS握手,验证SMTP服务器证书链是否正常:
若返回openssl s_client -connect smtp_host:587 -starttls smtp -CAfile /path/to/wallet/root_ca.pemVerify return code: 0 (ok),说明证书链验证正常,问题可能出在Oracle Wallet配置上。
4. 是否有用户成功在Oracle 19c中实现UTL_SMTP结合STARTTLS与身份认证的配置?
是的,大量Oracle 19c用户已成功配置该场景,核心要点包括:
- Wallet包含完整的信任链证书(根CA + 中间CA)
- 在
utl_smtp.open_connection中正确指定wallet_path和wallet_password - 严格遵循
EHLO→STARTTLS→ 再次EHLO→AUTH LOGIN的流程 - 确保数据库服务器可访问SMTP服务器587端口,且SMTP服务器允许该IP连接
内容的提问来源于stack exchange,提问作者rami-sf
相关产品推荐
相关产品推荐

