必须使用Wallet连接Oracle Autonomous Database,因其默认禁用密码直连,强制TLS加密与Wallet认证;未配置Wallet会导致ORA-28759或ORA-29024错误,核心在于正确下载解压Wallet、设置TNS_ADMIN环境变量指向其父目录,并使用tnsnames.ora中定义的服务名构建连接字符串。
Oracle Cloud Autonomous Database必须用Wallet连接
oracle cloud 上的自治数据库(autonomous database)默认禁用密码直连,强制使用 tls 加密 + wallet 认证。不配置 wallet,oracle.manageddataaccess 会报 ora-28759: failure to open file 或 ora-29024: certificate validation failure —— 这不是驱动版本或连接字符串写错,而是根本没加载 wallet。
下载并解压Wallet文件包
Wallet 不是手动创建的,必须从 OCI 控制台下载:
- 登录 https://www.php.cn/link/eaa9bf7df753a0756ace3d7553bc11ff,进入 Autonomous Database 实例详情页
- 点击 DB Connection → 选择
Wallet Type(推荐Standard,非Unified,后者需额外配置信任链) - 输入密码(即 Wallet 解压密码,非数据库密码),下载
Wallet_DBNAME.zip - 解压到项目目录下,例如
./Wallets/Wallet_DBNAME/,确保包含cwallet.sso、ojdbc.properties、tnsnames.ora等文件
.NET Core中设置TNS_ADMIN和连接字符串
TNS_ADMIN 环境变量必须指向 Wallet 解压后的**父目录**(不是 zip 文件路径,也不是 Wallet_DBNAME 子目录本身):
在 Program.cs 开头或 appsettings.json 加载前设置:
Environment.SetEnvironmentVariable("TNS_ADMIN", Path.Combine(AppContext.BaseDirectory, "Wallets", "Wallet_DBNAME"));
连接字符串用 tnsnames.ora 中定义的别名,例如:
string connectionString = "User Id=ADMIN;Password=your_db_password;Data Source=adb_region12345_high;";
其中 adb_region12345_high 是 tnsnames.ora 里声明的服务名(不是 IP 或 SERVICE_NAME)。
注意:ojdbc.properties 中的 oracle.net.wallet_location 会被忽略,.NET 驱动只认 TNS_ADMIN。
常见失败点:权限、路径、驱动版本
即使 Wallet 和连接字符串都对,以下三点仍会导致静默失败或超时:
-
Wallets/Wallet_DBNAME/目录需被应用进程有读取权限(Linux/macOS 下尤其注意chmod -R 755) - 必须使用
Oracle.ManagedDataAccess.Core≥ 3.21.100(旧版如 2.x 不支持 Wallet 的 TLS 1.2+ 握手) - 如果用
dotnet publish --self-contained,Wallet 目录不会自动打包,需手动复制到发布输出目录,并在代码中用AppContext.BaseDirectory定位 - 不要把 Wallet 放进
wwwroot或公开目录,.NET Core 应用启动时就应完成TNS_ADMIN设置,晚于中间件注册会失效
Wallet 本质是证书容器,它决定了你能不能建立 TLS 连接;而连接字符串里的服务名,只是告诉驱动去 tnsnames.ora 里查哪一组加密参数 —— 这两步缺一不可,且顺序不能颠倒。











