问题背景
oracle从低版本迁移到高版本12c、19c之后,在用户密码保持不变的情况下,出现用户密码登录报错的问题,报错为ora-28040和ora-01017。
ora-28040: no matching authentication protocol。
ora-01017: invalid username/password; logon denied。
问题一:使用低版本的客户端连接19c数据库出现ora-28040报错
错误:ora-28040: no matching authentication protocol。
原因:数据库允许客户端连接版本过高,默认版本为12,导致低版本的客户端连接认证协议不匹配。
解决方法:
1 调小数据库服务器允许客户端连接最小版本,在$oracle_home/network/admin/sqlnet.ora里面通过设置参数sqlnet.allowed_logon_version_server,修改之后立即生效不需要重启。
sqlnet.allowed_logon_version_server=8
2 更新客户端的连接驱动版本,兼容oracle12c、19c。
例如:jdbc版本需要11.2.0或以上才能兼容oracle12c、19c。
ojdbc需要8或以上才能兼容oracle12c、19c。
jdk版本需要8或以上才能兼容oracle12c、19c。
问题二:迁移到12c,19c之后,在用户密码没有修改的情况下,用户密码登录出现错误ora-01017
错误:ora-01017: invalid username/password; logon denied
原因:用户的密码哈希加密版本与数据库的密码认证算法不匹配导致,密码的哈希加密版本表示用户密码使用了哪些版本的加密算法,有4个密码加密版本10g、11g、12c和http:
10g: if an old case-insensitive orcl hash exists,10g的不区分密码大小的算法
11g: if a sha-1 hash exists
12c: if a de-optimized pbkdf2-based hash exists
http: if an md5 hash (for http digest authentication) exists
如果用户的密码加密算法与数据库密码认证算法不匹配,就会出现用户密码不正确的报错。
关于password_versions加密算法的版本生成
oracle12c、19c默认生成的密码加密版本为11g,12c,如果想生成10g的版本,需要先在sqlnet.ora里面配置数据库默认允许客户端连接版本sqlnet.allowed_logon_version_server为低版本,再通过创建用户或是重置密码生成。
查询用户密码加密信息。
set linesize 400 set pagesize 400 col name for a10 col password_version for a15 col password for a40 col spare4 for a60 select u.name,decode(bitand(u.spare1, 65536), 65536, null, decode( regexp_instr( nvl2(u.password, u.password, ' '), '^ $' ), 0, decode(length(u.password), 16, '10g ', null), '' ) || decode( regexp_instr( regexp_replace( nvl2(u.spare4, u.spare4, ' '), 's:000000000000000000000000000000000000000000000000000000000000', 'not_a_verifier' ), 's:' ), 0, '', '11g ' ) || decode( regexp_instr( nvl2(u.spare4, u.spare4, ' '), 't:' ), 0, '', '12c ' ) || decode( regexp_instr( regexp_replace( nvl2(u.spare4, u.spare4, ' '), 'h:00000000000000000000000000000000', 'not_a_verifier' ), 'h:' ), 0, '', 'http ' )) as password_version,u.password,u.spare4 from user$ u where name like 'test%';
密码加密算法版本是根据密码的hash值进行计算生成,10g加密版本的密码使用的是user$的password列进行存放,长度为16,11g加密版本的密码为s:开头,12c加密密码版本为t:开头。
关于修改password_versions
password_versions的版本是包含在加密后的密码里面的,如果想修改用户的密码版本,通常需要通过重置密码才行,不能通过使用user$里面查询的hash密码进行修改重置,否则,改完之后密码版本还是跟原来一样保持一致。
测试修改password_versions:
--从10g数据库里面获取的用户创建语句和加密后的密码 create user test10g identified by values '70c204055c9e3a1e'; --在19c数据库进行直接执行create user进行创建,可以看到只有password_versions 10g的版本,说明密码的加密版本是根据加密后的hash密码进行计算的。 username password_versions ---------------------------------------- ----------------- test10g 10g --在19c数据库通过明文密码进行重置,可以看到默认密码版本重新生成包含11g、12c版本 alter user test10g identified by oracle; username password_versions ---------------------------------------- ----------------- test10g 11g 12c sql> --在sqlnet.ora配置数据库服务器允许客户端连接最小版本为8 [oracle@rac19a admin]$ cat sqlnet.ora sqlnet.allowed_logon_version_server=8 --再重新通过明文密码进行重置,可以看到在设置允许客户端连接最小版本为8之后,密码版本包含10g、11g、12c版本 username password_versions ---------------------------------------- ----------------- test10g 10g 11g 12c --创建带10g,12c加密算法的用户,t:(12c)+16位的密码(10g) create user test10g12c identified by values 't:f27f1408cd6f04d3a569151b2e746c14177229a3052d6b819477a0db370496355dfeb13de546064a39a51220e35b8345d030235a00aab4b6148ba2464e7099247fcd1fcde8adc8a37fed9751e1e7a252;9cff9dbe2fea9b56'; username password_versions -------------------------------------------------- ----------------- test10g12c 10g 12c --创建带10g,11g加密算法的用户,s:(11g)+16位的密码(10g) create user test10g11g identified by values 's:36931834c6d687d4571af489e2e043722dd1dbc8beeb39522b0510978681;56d8c02dc8d4aed4'; username password_versions ---------------------------------------- ----------------- test10g11g 10g 11g --创建带11g,12g加密算法的用户,s:(11g)+t:(12c) create user test11g12c identified by values 't:716b0136fdc758f2f5df45f26ac5c8745ef21fcf1854e4b9c21f420fff1ce0a99eb5db6593b579396e4f2c0e3f5c543dc49958f6f6ec5680ab6f018a4d689d25ac0932ea45f77246ab882c82f354219b;s:36931834c6d687d4571af489e2e043722dd1dbc8beeb39522b0510978681'; username password_versions ---------------------------------------- ----------------- test11g12c 11g 12c --创建只带12g加密算法的用户,t:(12c) create user test12c identified by values 't:937995b3c97d239c7e1dbd6216f2a47093cc7f8f593dc901d99dd6fb0ef76bd57e290f23df57099b7664cb685b3c5114927032d13822cd1e9b4e43b9795a4c3235f24a09855caa5dcff447fd2e6ad9cb'; username password_versions ---------------------------------------- ----------------- test12c 12c
问题二-测试场景1:19c数据库设置了sec_case_sensitive_logon=false导致ora-01017
数据库参数设置了sec_case_sensitive_logon=false数据库会启用case-insensitive password-based authentication(10g版本的认证算法,不区分密码大小写)认证,这时候如果用户密码的加密算法没有包含10g的版本,就会出现密码报错,因为11g、12c采用的是区分密码大小写的认证,并且12c的密码认证会与10g版本的认证算法产生冲突。
测试过程:
测试用户:test2(11g,12c),test3(10g,11g,12c) ---默认参数为true sql> show parameter sec_case_sensitive_logon name type value ------------------------------------ ----------- ------------------------------ sec_case_sensitive_logon boolean true ---测试链接test2,test3用户都可以正常链接 [oracle@rac1 ~]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb sql*plus: release 11.2.0.4.0 production on mon mar 11 17:16:45 2024 copyright (c) 1982, 2013, oracle. all rights reserved. connected to: oracle database 19c enterprise edition release 19.0.0.0.0 - production sql> exit disconnected from oracle database 19c enterprise edition release 19.0.0.0.0 - production [oracle@rac1 ~]$ sqlplus test3/oracle@172.20.10.100:1521/testpdb sql*plus: release 11.2.0.4.0 production on mon mar 11 17:16:50 2024 copyright (c) 1982, 2013, oracle. all rights reserved. connected to: oracle database 19c enterprise edition release 19.0.0.0.0 - production sql> ---修改参数为false,可以在线改,不能在pdb里面单独修改 alter system set sec_case_sensitive_logon=false; ---测试test2(11g,12c)用户连接出现ora-01017 [oracle@rac19a admin]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb sql*plus: release 19.0.0.0.0 - production on mon mar 11 17:18:22 2024 version 19.21.0.0.0 copyright (c) 1982, 2022, oracle. all rights reserved. error: ora-01017: invalid username/password; logon denied ---测试test3(10g,11g,12c)连接正常 [oracle@rac19a admin]$ sqlplus test3/oracle@172.20.10.100:1521/testpdb sql*plus: release 19.0.0.0.0 - production on mon mar 11 17:18:39 2024 version 19.21.0.0.0 copyright (c) 1982, 2022, oracle. all rights reserved. last successful login time: mon mar 11 2024 17:16:50 +08:00 connected to: oracle database 19c enterprise edition release 19.0.0.0.0 - production version 19.21.0.0.0 sql>
建议:在12c之后sec_case_sensitive_logon参数已经被废弃,只保留参数向下兼容,不建议在12c之后的环境手动设置该参数为false。
问题二-测试场景2:用户密码加密算法没有包含10g版本,并且客户端使用了低版本进行连接,连接19c数据库出现ora-01017报错
测试过程:
测试连接用户test2(11g,12c) ---使用10.2.0.5的sqlplus,出现ora-01017报错 [oracle@rac1 ~]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb sql*plus: release 10.2.0.5.0 - production on mon mar 11 17:22:42 2024 copyright (c) 1982, 2010, oracle. all rights reserved. error: ora-01017: invalid username/password; logon denied enter user-name: ---使用高版本的11.2.0.4的sqlplus,测试成功 [oracle@rac1 admin]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb sql*plus: release 11.2.0.4.0 production on mon mar 11 17:23:11 2024 copyright (c) 1982, 2013, oracle. all rights reserved. connected to: oracle database 19c enterprise edition release 19.0.0.0.0 - production sql> ---测试连接用户test3(10g,11g,12c) ---使用10.2.0.5的sqlplus,连接成功 [oracle@rac1 ~]$ sqlplus test3/oracle@172.20.10.100:1521/testpdb sql*plus: release 10.2.0.5.0 - production on mon apr 15 15:10:50 2024 copyright (c) 1982, 2010, oracle. all rights reserved. connected to: oracle database 19c enterprise edition release 19.0.0.0.0 - production sql>
建议:
1 客户端版本需要进行升级,兼容12c、19c版本。
2 对于使用低版本的客户端连接,用户的密码加密版本需要包含10g版本。
问题二-测试场景3:password_versions只有10g版本,连接19c数据库出现报错ora-01017
测试过程:
测试连接用户test10g(10g) ---使用oracle11g的sqlplus连接报错ora-01017 [oracle@rac1 admin]$ sqlplus test10g/oracle@172.20.10.100:1521/testpdb sql*plus: release 11.2.0.4.0 production on mon mar 11 17:33:14 2024 copyright (c) 1982, 2013, oracle. all rights reserved. error: ora-01017: invalid username/password; logon denied enter user-name: ^c ---需要在19c的数据库服务器上配置允许低版本客户端连接的sqlnet.allowed_logon_version_server,才能正常登录使用 [oracle@rac1 admin]$ sqlplus test10g/oracle@172.20.10.100:1521/testpdb sql*plus: release 11.2.0.4.0 production on mon mar 11 17:33:25 2024 copyright (c) 1982, 2013, oracle. all rights reserved. connected to: oracle database 19c enterprise edition release 19.0.0.0.0 - production sql>
建议:对于低版本数据库迁移到12c之后的数据库版本,要配置允许客户端连接版本为低版本,兼容低版本的算法。
关于不同客户端版本连接oracle19c的密码版本测试
数据库:19.21.0.0
数据库sqlnet:allowed_logon_version_server:8
测试用户:
测试结果:
结论:
1 使用10g的客户端,只要用户的password_version里面有包含10g加密算法,就可以连接成功。
2 使用11g的客户端,对于password_version包含单独的一个加密版本,11g及以下的加密算法都可以连接成功,对于包含两个及以上的加密版本,需要包含11g加密算法才能连接成功。
3 使用12c的客户端,password_version不管包含什么版本的加密算法都可以连接成功。
总结
到此这篇关于oracle数据库升级到19c用户登录报错问题解决办法的文章就介绍到这了,更多相关oracle升级19c用户登录报错内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论