SQLNET.ENCRYPTION_SERVER=REQUIRED强制客户端必须支持并启用加密,否则握手阶段直接拒绝连接并报ORA-12650;需确保客户端与服务端SQLNET.ENCRYPTION_TYPES_*参数算法交集非空,且避免混用Wallet或SSL配置。
SQL*Net.ora 里 SQLNET.ENCRYPTION_SERVER 设成 REQUIRED 会怎样
它强制所有客户端连接必须加密,不支持加密的旧客户端(比如某些 java 6 的 ojdbc6.jar 默认配置、或未启用 tls 的 sql*plus)直接被拒绝,报错 ora-12650: no common encryption or data integrity algorithm。不是连不上就重试,而是握手阶段直接断开。
实操建议:
- 上线前务必用目标客户端版本做真实连接测试,别只看服务端配置
- 若需兼容老客户端,改用
ACCEPTED(服务端接受但不强制),再配合SQLNET.ENCRYPTION_TYPES_SERVER限定算法范围 -
REQUIRED模式下,SQLNET.ENCRYPTION_TYPES_SERVER必须至少包含一个客户端也支持的算法,比如(AES256, AES192),避免因算法不交集导致失败
sqlnet.ora 中 SQLNET.ENCRYPTION_TYPES_CLIENT 和 SQLNET.ENCRYPTION_TYPES_SERVER 参数差异
两者控制方向相反:客户端参数决定“我愿意用哪些算法”,服务端参数决定“我只接受哪些算法”。它们不自动协商补全,而是取交集——交集为空就报 ORA-12650。
常见错误现象:服务端配了 (AES256),客户端却只写了 (RC4_256),连接失败;或者客户端没配该参数(默认值为空),服务端又设为 REQUIRED,结果连 Oracle 自带的 sqlplus 都连不上。
实操建议:
- Oracle 12c 及以后,
AES256是推荐首选,RC4系列已弃用且部分 JDK 版本默认禁用 - 服务端和客户端最好显式配一致的算法列表,例如都设为
(AES256, AES192),避免依赖隐式默认行为 - 注意大小写敏感:
AES256合法,aes256无效
启用 Native Network Encryption 后,tnsping 和 sqlplus 连接行为的区别
tnsping 只测 TNS 层连通性,不走加密握手,所以即使加密全开,tnsping 仍显示成功,但这完全不能代表实际连接可用。
而 sqlplus /@mydb 或 JDBC 连接才真正触发加密协商。这时候才会暴露算法不匹配、证书路径错误、或客户端未加载加密库等问题。
实操建议:
- 验证是否真加密生效,别信
tnsping,要用sqlplus -L user/pass@mydb实测,并抓包确认 TLS/SSL 握手或 Oracle 加密载荷 - Linux 下若遇到
libnnz19.so找不到,检查$ORACLE_HOME/lib是否在LD_LIBRARY_PATH中 - JDBC 用户注意:JDK 8u161+ 默认禁用 RC4,若服务端还配着
RC4_256,必须显式在连接串加&oracle.net.encryption_client=REQUIRED&oracle.net.encryption_types_client=(AES256)
Oracle Wallet 不参与 Native Network Encryption,别混用
Native Network Encryption 是传输层对称加密(AES/RC4),靠 sqlnet.ora 配置驱动;Wallet 是用于存储证书、私钥,支撑的是 TLS/SSL 模式(即 SSL_SERVER_CERT_DN 认证那一套)。两者机制不同、配置分离、日志报错也不同。
容易踩的坑:看到文档里有 “wallet” 就以为加密必须配它,结果在纯 Native 模式下硬加 WALLET_LOCATION,不仅无效,还可能干扰连接流程;或者把 SQLNET.ENCRYPTION_SERVER=REQUIRED 和 SSL_VERSION=TLSv1.2 错误地混在同一套配置里,导致服务端无法启动监听。
实操建议:
- 只用 Native 加密,就彻底删掉所有
WALLET_LOCATION、SSL_*相关行 - 要 TLS,就关掉
SQLNET.ENCRYPTION_*系列参数,改用SSL_CLIENT_AUTHENTICATION=FALSE+ 正确 Wallet 路径 - 查是否真走 Native 加密:看监听日志有没有
Encryption service is enabled,而不是看有没有 wallet 初始化信息
tnsping。加密不是开关,是双向契约。

















