Oracle-数据库升级到19C用户登录报错题目

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

题目背景
        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. ​set linesize 400
  2. set pagesize 400
  3. col name for a10
  4. col password_version for a15
  5. col password for a40
  6. col SPARE4 for a60
  7. select u.name,decode(bitand(u.spare1, 65536), 65536, NULL, decode(
  8.        REGEXP_INSTR(
  9.          NVL2(u.password, u.password, ' '),
  10.          '^                $'
  11.        ),
  12.        0,
  13.        decode(length(u.password), 16, '10G ', NULL),
  14.        ''
  15.      ) ||
  16.      decode(
  17.        REGEXP_INSTR(
  18.          REGEXP_REPLACE(
  19.            NVL2(u.spare4, u.spare4, ' '),
  20.            'S:000000000000000000000000000000000000000000000000000000000000',
  21.            'not_a_verifier'
  22.          ),
  23.          'S:'
  24.        ),
  25.        0, '', '11G '
  26.      ) ||
  27.      decode(
  28.        REGEXP_INSTR(
  29.          NVL2(u.spare4, u.spare4, ' '),
  30.          'T:'
  31.        ),
  32.        0, '', '12C '
  33.      ) ||
  34.      decode(
  35.        REGEXP_INSTR(
  36.          REGEXP_REPLACE(
  37.            NVL2(u.spare4, u.spare4, ' '),
  38.            'H:00000000000000000000000000000000',
  39.            'not_a_verifier'
  40.          ),
  41.          'H:'
  42.        ),
  43.        0, '', 'HTTP '
  44.      )) as password_version,u.password,u.SPARE4
  45. from user$ u
  46. where name like 'TEST%';
复制代码
        密码加密算法版本是根据密码的hash值进行盘算生成,10G加密版本的密码使用的是USER$的PASSWORD列进行存放,长度为16,11G加密版本的密码为S:开头,12C加密密码版本为T:开头。


关于修改password_versions
        password_versions的版本是包含在加密后的密码内里的,如果想修改用户的密码版本,通常必要通过重置密码才行,不能通过使用user$内里查询的hash密码进行修改重置,否则,改完之后密码版本还是跟原来一样保持同等。
        测试修改password_versions:
  1. --从10G数据库里面获取的用户创建语句和加密后的密码
  2. CREATE USER TEST10G IDENTIFIED BY VALUES '70C204055C9E3A1E';
  3. --在19c数据库进行直接执行create user进行创建,可以看到只有PASSWORD_VERSIONS 10G的版本,说明密码的加密版本是根据加密后的hash密码进行计算的。
  4. USERNAME                                 PASSWORD_VERSIONS
  5. ---------------------------------------- -----------------
  6. TEST10G                                  10G
  7. --在19c数据库通过明文密码进行重置,可以看到默认密码版本重新生成包含11G、12C版本
  8. alter user test10g identified by oracle;
  9. USERNAME                                 PASSWORD_VERSIONS
  10. ---------------------------------------- -----------------
  11. TEST10G                                  11G 12C
  12. SQL>
  13. --在sqlnet.ora配置数据库服务器允许客户端连接最小版本为8
  14. [oracle@rac19a admin]$ cat sqlnet.ora
  15. SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
  16. --再重新通过明文密码进行重置,可以看到在设置允许客户端连接最小版本为8之后,密码版本包含10G、11G、12C版本
  17. USERNAME                                 PASSWORD_VERSIONS
  18. ---------------------------------------- -----------------
  19. TEST10G                                  10G 11G 12C
  20. --创建带10G,12C加密算法的用户,T:(12C)+16位的密码(10G)
  21. CREATE USER TEST10G12C IDENTIFIED BY VALUES 'T:F27F1408CD6F04D3A569151B2E746C14177229A3052D6B819477A0DB370496355DFEB13DE546064A39A51220E35B8345D030235A00AAB4B6148BA2464E7099247FCD1FCDE8ADC8A37FED9751E1E7A252;9CFF9DBE2FEA9B56';
  22. USERNAME                                           PASSWORD_VERSIONS
  23. -------------------------------------------------- -----------------
  24. TEST10G12C                                         10G 12C
  25. --创建带10G,11G加密算法的用户,S:(11G)+16位的密码(10G)
  26. CREATE USER TEST10G11G IDENTIFIED BY VALUES 'S:36931834C6D687D4571AF489E2E043722DD1DBC8BEEB39522B0510978681;56D8C02DC8D4AED4';
  27. USERNAME                                 PASSWORD_VERSIONS
  28. ---------------------------------------- -----------------
  29. TEST10G11G                               10G 11G
  30. --创建带11G,12G加密算法的用户,S:(11G)+T:(12C)
  31. CREATE USER TEST11G12C IDENTIFIED BY VALUES 'T:716B0136FDC758F2F5DF45F26AC5C8745EF21FCF1854E4B9C21F420FFF1CE0A99EB5DB6593B579396E4F2C0E3F5C543DC49958F6F6EC5680AB6F018A4D689D25AC0932EA45F77246AB882C82F354219B;S:36931834C6D687D4571AF489E2E043722DD1DBC8BEEB39522B0510978681';
  32. USERNAME                                 PASSWORD_VERSIONS
  33. ---------------------------------------- -----------------
  34. TEST11G12C                               11G 12C
  35. --创建只带12G加密算法的用户,T:(12C)
  36. CREATE USER TEST12C IDENTIFIED BY VALUES 'T:937995B3C97D239C7E1DBD6216F2A47093CC7F8F593DC901D99DD6FB0EF76BD57E290F23DF57099B7664CB685B3C5114927032D13822CD1E9B4E43B9795A4C3235F24A09855CAA5DCFF447FD2E6AD9CB';
  37. USERNAME                                 PASSWORD_VERSIONS
  38. ---------------------------------------- -----------------
  39. 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. 测试用户:TEST2(11G,12c),TEST3(10G,11G,12c)
  2. ---默认参数为true
  3. SQL> show parameter sec_case_sensitive_logon
  4. NAME                                 TYPE        VALUE
  5. ------------------------------------ ----------- ------------------------------
  6. sec_case_sensitive_logon             boolean     TRUE
  7. ---测试链接TEST2,TEST3用户都可以正常链接
  8. [oracle@rac1 ~]$  sqlplus test2/oracle@172.20.10.100:1521/testpdb
  9. SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:16:45 2024
  10. Copyright (c) 1982, 2013, Oracle.  All rights reserved.
  11. Connected to:
  12. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
  13. SQL> exit
  14. Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
  15. [oracle@rac1 ~]$  sqlplus test3/oracle@172.20.10.100:1521/testpdb
  16. SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:16:50 2024
  17. Copyright (c) 1982, 2013, Oracle.  All rights reserved.
  18. Connected to:
  19. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
  20. SQL>
  21. ---修改参数为false,可以在线改,不能在pdb里面单独修改
  22. alter system set sec_case_sensitive_logon=false;
  23. ---测试TEST2(11G,12c)用户连接出现ORA-01017
  24. [oracle@rac19a admin]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb
  25. SQL*Plus: Release 19.0.0.0.0 - Production on Mon Mar 11 17:18:22 2024
  26. Version 19.21.0.0.0
  27. Copyright (c) 1982, 2022, Oracle.  All rights reserved.
  28. ERROR:
  29. ORA-01017: invalid username/password; logon denied
  30. ---测试TEST3(10G,11G,12c)连接正常
  31. [oracle@rac19a admin]$ sqlplus test3/oracle@172.20.10.100:1521/testpdb
  32. SQL*Plus: Release 19.0.0.0.0 - Production on Mon Mar 11 17:18:39 2024
  33. Version 19.21.0.0.0
  34. Copyright (c) 1982, 2022, Oracle.  All rights reserved.
  35. Last Successful login time: Mon Mar 11 2024 17:16:50 +08:00
  36. Connected to:
  37. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
  38. Version 19.21.0.0.0
  39. SQL>
复制代码
建议:在12c之后sec_case_sensitive_logon参数已经被废弃,只保留参数向下兼容,不建议在12c之后的环境手动设置该参数为false。

        题目二-测试场景2:用户密码加密算法没有包含10G版本,而且客户端使用了低版本进行毗连,毗连19c数据库出现ORA-01017报错
        测试过程:
  1. 测试连接用户TEST2(11G,12c)
  2. ---使用10.2.0.5的sqlplus,出现ORA-01017报错
  3. [oracle@rac1 ~]$  sqlplus test2/oracle@172.20.10.100:1521/testpdb
  4. SQL*Plus: Release 10.2.0.5.0 - Production on Mon Mar 11 17:22:42 2024
  5. Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
  6. ERROR:
  7. ORA-01017: invalid username/password; logon denied
  8. Enter user-name:
  9. ---使用高版本的11.2.0.4的sqlplus,测试成功
  10. [oracle@rac1 admin]$ sqlplus test2/oracle@172.20.10.100:1521/testpdb
  11. SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:23:11 2024
  12. Copyright (c) 1982, 2013, Oracle.  All rights reserved.
  13. Connected to:
  14. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
  15. SQL>
  16. ---测试连接用户TEST3(10G,11G,12c)
  17. ---使用10.2.0.5的sqlplus,连接成功
  18. [oracle@rac1 ~]$ sqlplus test3/oracle@172.20.10.100:1521/testpdb
  19. SQL*Plus: Release 10.2.0.5.0 - Production on Mon Apr 15 15:10:50 2024
  20. Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
  21. Connected to:
  22. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
  23. SQL>
复制代码
        建议:
        1 客户端版本必要进行升级,兼容12c、19c版本。
        2 对于使用低版本的客户端毗连,用户的密码加密版本必要包含10G版本。

题目二-测试场景3:password_versions只有10G版本,毗连19c数据库出现报错ORA-01017
        测试过程:
  1. 测试连接用户TEST10g(10g)
  2. ---使用oracle11g的sqlplus连接报错ORA-01017
  3. [oracle@rac1 admin]$ sqlplus test10g/oracle@172.20.10.100:1521/testpdb
  4. SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:33:14 2024
  5. Copyright (c) 1982, 2013, Oracle.  All rights reserved.
  6. ERROR:
  7. ORA-01017: invalid username/password; logon denied
  8. Enter user-name: ^C
  9. ---需要在19c的数据库服务器上配置允许低版本客户端连接的SQLNET.ALLOWED_LOGON_VERSION_SERVER,才能正常登录使用
  10. [oracle@rac1 admin]$ sqlplus test10g/oracle@172.20.10.100:1521/testpdb
  11. SQL*Plus: Release 11.2.0.4.0 Production on Mon Mar 11 17:33:25 2024
  12. Copyright (c) 1982, 2013, Oracle.  All rights reserved.
  13. Connected to:
  14. Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
  15. 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不管包含什么版本的加密算法都可以毗连乐成。

Tip:欢迎关注公众号:勇敢牛牛的笔记,超100+的原创内容,每周不定期更新数据库技术文章

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表