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

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=16
    
    重启监听后执行utl_smtp.starttls,查看生成的跟踪文件,里面包含TLS握手步骤、证书验证的具体错误信息(如证书未被信任、链不完整等)。
  • 使用openssl模拟TLS握手,验证SMTP服务器证书链是否正常:
    openssl s_client -connect smtp_host:587 -starttls smtp -CAfile /path/to/wallet/root_ca.pem
    
    若返回Verify 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 16:57:35