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,修改之后立即生效不需要重启。
1 | 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为低版本,再通过创建用户或是重置密码生成。
查询用户密码加密信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | CREATE USER TEST10G IDENTIFIED BY VALUES '70C204055C9E3A1E' ;
USERNAME PASSWORD_VERSIONS
TEST10G 10G
alter user test10g identified by oracle;
USERNAME PASSWORD_VERSIONS
TEST10G 11G 12C
SQL>
[oracle@rac19a admin]$ cat sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
USERNAME PASSWORD_VERSIONS
TEST10G 10G 11G 12C
CREATE USER TEST10G12C IDENTIFIED BY VALUES 'T:F27F1408CD6F04D3A569151B2E746C14177229A3052D6B819477A0DB370496355DFEB13DE546064A39A51220E35B8345D030235A00AAB4B6148BA2464E7099247FCD1FCDE8ADC8A37FED9751E1E7A252;9CFF9DBE2FEA9B56' ;
USERNAME PASSWORD_VERSIONS
TEST10G12C 10G 12C
CREATE USER TEST10G11G IDENTIFIED BY VALUES 'S:36931834C6D687D4571AF489E2E043722DD1DBC8BEEB39522B0510978681;56D8C02DC8D4AED4' ;
USERNAME PASSWORD_VERSIONS
TEST10G11G 10G 11G
CREATE USER TEST11G12C IDENTIFIED BY VALUES 'T:716B0136FDC758F2F5DF45F26AC5C8745EF21FCF1854E4B9C21F420FFF1CE0A99EB5DB6593B579396E4F2C0E3F5C543DC49958F6F6EC5680AB6F018A4D689D25AC0932EA45F77246AB882C82F354219B;S:36931834C6D687D4571AF489E2E043722DD1DBC8BEEB39522B0510978681' ;
USERNAME PASSWORD_VERSIONS
TEST11G12C 11G 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版本的认证算法产生冲突。
测试过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | 测试用户:TEST2(11G,12c),TEST3(10G,11G,12c)
SQL> show parameter sec_case_sensitive_logon
NAME TYPE VALUE
sec_case_sensitive_logon boolean TRUE
[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>
alter system set sec_case_sensitive_logon= false ;
[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
[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报错
测试过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 测试连接用户TEST2(11G,12c)
[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 :
[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>
[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
测试过程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 测试连接用户TEST10g(10g)
[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
[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不管包含什么版本的加密算法都可以连接成功。