必须先配置wallet,否则oracle 21c的tcps监听器无法启动;wallet须用orapki创建并启用auto_login_local,目录权限为700,listener.ora需独立配置tcps监听器,sqlnet.ora须指定绝对路径及ssl_version=1.2等参数。

必须先配 Wallet,不能跳过这步
Oracle 21c 的 TCPS 监听器启动时会校验 Wallet 是否存在、是否可读、是否含有效证书。没 Wallet 或路径错,lsnrctl start 会静默失败,lsnrctl status 看不到 TCPS 条目,日志里只有模糊的 TNS-12547: TNS:lost contact。
Wallet 必须用 orapki 创建,且启用 auto_login_local:
orapki wallet create -wallet "/u02/app/oracle/wallet" -pwd MyWalletPass123 -auto_login_local
接着加自签名证书(注意 -dn 要用 hostname -f 输出的全限定名):
orapki wallet add -wallet "/u02/app/oracle/wallet" -pwd MyWalletPass123 -dn "CN=`hostname -f`" -keysize 2048 -self_signed -validity 3650
- 目录权限必须是
700,属主oracle:oinstall;含空格或中文的路径在listener.ora中必须加双引号 - 不要用
mkstore创建 Wallet —— 它不生成cwallet.sso,监听器无法 auto-login -
orapki wallet display应同时显示Trusted Certificates和User Certificates,否则握手必失败
listener.ora 里只写 TCPS 地址,别混 TCP
21c 不允许同一监听器同时绑定 PROTOCOL=TCP 和 PROTOCOL=TCPS。必须新建独立监听器(如 LISTENER_TCPS),端口不能复用已有 TCP 端口(比如 1521)。
典型配置段(注意 IP=FIRST 和 HOST 值要匹配实际网卡):
LISTENER_TCPS =<br> (DESCRIPTION_LIST =<br> (DESCRIPTION =<br> (ADDRESS = (PROTOCOL = TCPS)(HOST = db21c.example.com)(PORT = 2484)(IP = FIRST))<br> )<br> )
- 别把 TCPS 监听器名写成
LISTENER—— 这会覆盖默认 TCP 监听,导致普通连接中断 - 如果主机有多个 IP,
HOST必须填监听器实际绑定的 IP,不能填0.0.0.0或* - 重启监听器前,先确认
lsnrctl status LISTENER_TCPS返回 “The listener supports no services” 是正常初始状态;启动后应变为 READY
sqlnet.ora 配置决定 TLS 版本和认证强度
21c 默认只接受 TLS 1.2+,若客户端用旧版 JDK(如 8u192 之前),不设 SSL_VERSION 就会握手失败,报 ORA-12640: Authentication service initialization failed。
关键项必须写全:
WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = /u02/app/oracle/wallet)))<br>SSL_VERSION = 1.2<br>SSL_CLIENT_AUTHENTICATION = FALSE<br>SQLNET.AUTHENTICATION_SERVICES = (TCPS, NTS)
-
SSL_VERSION = 1.2是硬性要求;设1.3可能触发兼容问题,21c 官方文档未完全确认支持 -
SSL_CLIENT_AUTHENTICATION = TRUE仅当真需双向认证时开启——此时客户端也必须配 Wallet,且服务端要导入客户端 CA 证书,复杂度陡增 -
SQLNET.AUTHENTICATION_SERVICES必须显式包含TCPS,否则监听器拒绝处理 TCPS 连接请求
验证时别只看 lsnrctl status
lsnrctl status LISTENER_TCPS 显示 tcps://:2484 是必要但不充分条件。真正加密生效,得三层都对得上:
- 监听器层:运行
lsnrctl services LISTENER_TCPS,输出中对应服务的Protocol列必须是TCPS,不是TCP - 网络层:用
openssl s_client -connect db21c.example.com:2484 -showcerts能拿到证书链,且Verify return code: 0 (ok) - 数据库层:客户端连上后查
SELECT SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') FROM DUAL,结果必须是tcps,不是tcp
最容易被忽略的是:21c 的 Wallet 路径在 sqlnet.ora 里必须写绝对路径,大小写、斜杠方向、结尾是否带 / 都影响加载;它不解析 $ORACLE_HOME,也不认 ~。配错就是 ORA-29024,而不是更友好的提示。











