Oracle 19c不支持SSL证书直接替代密码登录,需通过SSL加密通道、客户端证书、Oracle Wallet及IDENTIFIED EXTERNALLY组合实现外部认证;ORA-12637是SSL握手失败错误,须检查sqlnet.ora配置、证书链信任、Wallet路径权限及os_authent_prefix清空。Oracle 19c 不支持用 SSL/TLS 证书直接“替代密码”登录——它没有类似 PostgreSQL 的
cert 认证模式。所谓“SSL 身份验证”,实际是 SSL 加密通道 + 客户端证书 + Oracle Wallet + IDENTIFIED EXTERNALLY 组合实现的外部认证,本质仍是基于 DN 字符串匹配的操作系统/PKI 级认证。
ORA-12637 出现时,根本没走到认证那步
ora-12637 是 ssl/tls 握手失败错误,不是用户名或证书校验失败。连接卡在建立加密通道阶段,数据库甚至还没开始查用户。
- 服务端
sqlnet.ora必须启用 SSL:含SQLNET.ENCRYPTION_SERVER = required且SSL_VERSION = 1.2(19c 默认禁用 TLS 1.0/1.1) - 客户端
sqlnet.ora需设SSL_SERVER_DN_MATCH = ON,且 Wallet 中必须已导入服务端证书链的根 CA -
tnsping测不通 SSL,改用openssl s_client -connect host:port -showcerts抓握手过程,看Verify return code是否为 0 - 服务端 Wallet 要放服务端证书+私钥;客户端 Wallet 要放信任 CA + 自己的客户端证书+私钥——缺一不可
客户端证书 DN 必须与数据库用户名完全一致
Oracle 不解析 CN 或提取字段,而是做全字符串匹配。证书里怎么写 DN,数据库里就得怎么建用户。
- 生成证书时明确指定简洁 DN,例如:
"CN=alice,OU=dev,O=myorg",避免空格、逗号转义、特殊字符 - 创建用户必须加双引号:
CREATE USER "CN=alice,OU=dev,O=myorg" IDENTIFIED EXTERNALLY; - 若只想按
CN匹配,需服务端sqlnet.ora同时配置:SSL_CLIENT_AUTHENTICATION = TRUE和SSL_USER_CN_MATCH = TRUE(19c 支持但文档极少提及) -
os_authent_prefix必须清空(设为空字符串),否则会自动拼接前缀导致 DN 匹配失败
Wallet 路径权限错一个字,整个链路就断
Oracle 进程(如监听器、sqlplus)必须能读取 Wallet 目录下的 cwallet.sso 文件。权限不足会导致 SSL 握手静默失败,日志里可能只报 ORA-12578 或无明确提示。
- Wallet 目录权限建议设为
700,cwallet.sso设为600 - 确认运行 Oracle 客户端或监听器的 OS 用户对 Wallet 路径有读权限(尤其在 Linux 上用不同用户启动监听器时)
- 服务端和客户端 Wallet 路径需分别在各自
sqlnet.ora中通过WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /path/to/wallet)))明确指定 - 不要依赖默认路径;
mkstore -wrl创建后,务必检查生成的cwallet.sso和ewallet.p12是否存在且非空











