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

MacOS下Python通过Oracle Instant Client TCPS连接报ORA-29024错误如何解决

ORA-29024 错误排查及解决方案

一、现有配置修正

首先排查已提交配置中的明显错误:

  • 修正sqlnet.ora中WALLET_LOCATION的DIRECTORY参数,将示例路径/instantclient_19_8/network/admin替换为你的instantclient下network/admin目录的实际绝对路径,Windows系统注意用反斜杠,Linux/macOS用正斜杠
  • 修正tnsnames.ora中{SVC_NAME的语法错误,补充闭合的}为{SVC_NAME};如果你的Python代码中已经硬编码了完整DSN,tnsnames.ora不是必须配置项,可忽略该文件
  • 验证Pycharm中TNS_ADMIN环境变量是否生效,可在代码开头加一行import os; print(os.getenv('TNS_ADMIN'))运行确认输出路径正确,避免IDE环境变量未加载的问题
  • 修正Python代码中ds n的笔误为dsn,同时确认DSN内的HOST、PORT、SERVICE_NAME与数据库实际配置完全一致
  • 如果你配置了SQLNET.WALLET_OVERRIDE = TRUE,且DBA提供的钱包中已存储了用户认证凭证,连接时可以不用传入user和password参数,避免密码输入错误

二、核心错误原因排查

ORA-29024: Certificate validation failure本质是客户端不信任数据库服务端返回的SSL证书,优先排查以下两点:

  • 确认DBA提供的钱包内是否已包含数据库服务端SSL证书的根CA/中间CA证书,多数情况下DBA提供的钱包仅包含用户认证凭证,未添加服务端信任根
  • 在sqlnet.ora中新增配置指定SSL版本,避免版本不兼容问题:
    SSL_VERSION = 1.2
    
    若数据库使用其他TLS版本,替换为对应版本号即可

三、orapki工具使用说明

  • Oracle Instant Client默认不带orapki工具,你可以下载对应版本的完整Oracle Database Client(选择管理员安装或自定义安装选中orapki组件),或找DBA提取orapki二进制文件及依赖库,放到Instant Client根目录下即可运行
  • 只要你持有钱包密码(ewallet.p12的密码,由DBA创建时设置),或持有自动登录钱包文件cwallet.sso的读取权限,即可自行操作钱包,不需要DBA协助,常用操作命令如下:
    • 查看钱包内所有证书:orapki wallet display -wallet [钱包目录绝对路径]
    • 向钱包内添加服务端根CA证书:orapki wallet add -wallet [钱包目录绝对路径] -trusted_cert -cert [根证书文件路径]
    • 添加完成后自动登录钱包cwallet.sso会同步更新,无需额外配置

四、临时快速验证方案

如果暂时无法完成钱包配置,测试环境下可修改Python代码直接指定SSL参数跳过钱包配置:

import cx_Oracle

# 替换为实际的数据库连接参数
dsn = """(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCPS)(HOST={HOST_ADDRESS})(PORT={PORT_NBR})))(CONNECT_DATA=(SERVICE_NAME={SVC_NAME})))"""
cx_Oracle.init_oracle_client(lib_dir='[你的instantclient实际路径]/instantclient_19_8')

# 连接时新增SSL参数,ssl_server_cert_dn找DBA获取服务端证书的主体DN
ora_conn = cx_Oracle.connect(
    user=usr,
    password=pw,
    dsn=dsn,
    encoding="UTF-8",
    ssl_context=cx_Oracle.SSLContext(cx_Oracle.SSL_VERSION_TLS_1_2),
    ssl_server_cert_dn="CN=服务端证书DN,OU=xxx,O=xxx"
)

# 仅测试环境临时使用,生产环境禁止关闭证书验证
# ora_conn = cx_Oracle.connect(user=usr,password=pw,dsn=dsn,encoding="UTF-8",ssl_verify=False)

cursor = ora_conn.cursor()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 09:06:03