低版本客戶端連線高版本資料庫報錯ORA-28040、ORA-01017

AlfredZhao發表於2023-01-17

測試環境:

  • 客戶端:Oracle 11.2.0.1
  • 服務端:Oracle 19.16

測試過程:

1.低版本客戶端連線高版本資料庫報錯ORA-28040

使用oracle 11.2.0.1 的客戶端,對19c的服務端進行連線時,報錯:ORA-28040: No matching authentication protocol

C:\Users\Alfred>sqlplus sys/oracle@192.168.1.4/demo as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 17:52:30 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-28040: No matching authentication protocol

這個錯誤其實我在給客戶做經驗分享類的交流時,反覆講過,解決起來也很簡單,同時也有MOS文件 2296947.1 依據:

  • 12.2: ORA-28040 Followed by ORA-1017 When Client is Under Version 12. (Doc ID 2296947.1)

如果在不方便升級客戶端的情況下,只能在服務端,配置sqlnet.ora檔案:

[oracle@bogon admin]$ pwd
/u01/app/oracle/product/19.3.0/db_1/network/admin
[oracle@bogon admin]$ cat sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_SERVER=10

非常簡單,且不用重啟任何服務,不用過載監聽,即可生效;
再次連線,不再報錯ORA-28040。

2.低版本客戶端連線高版本資料庫報錯ORA-01017

不再報錯ORA-28040,但開始報錯:ORA-01017: invalid username/password; logon denied

C:\Users\Alfred>sqlplus sys/oracle@192.168.1.4/demo as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 21:17:09 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


請輸入使用者名稱:

可是輸入的密碼確認是沒問題的,使用高版本的客戶端,同樣的密碼測試連線也是OK的。
那是什麼問題呢?想到是密碼版本問題,根據MOS 文件 2040705.1:

  • Lockout of all database authenticated users getting error ORA-01017: invalid username/password; logon denied (Doc ID 2040705.1)

When you inspect the DBA_USERS.PASSWORD_VERSIONS you only see 11G and 12C values but not 10G.

查詢使用者的PASSWORD_VERSIONS:

SQL> select username, password_versions from dba_users where password_versions is not null;

USERNAME		       PASSWORD_VERSIONS
------------------------------ -----------------
SYS			       11G 12C
SYSTEM			       11G 12C
CTXSYS			       11G 12C

With this solution you will also need to change the user password again so the DBA_USERS.PASSWORD_VERSIONS will get a 10G value, however the DES based verifiers are outdated and should only be used in exceptional cases when legacy client applications still need it.

alter user sys identified by oracle;

再次,嘗試從11.2.0.1的客戶端,對19c的服務端進行連線時,可以成功連線:

C:\Users\Alfred>sqlplus sys/oracle@192.168.1.4/demo as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 21:57:33 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


連線到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL> exit
從 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 斷開

C:\Users\Alfred>

但是有個疑問,這裡再次改過SYS密碼後,查詢PASSWORD_VERSIONS其實還是沒有顯示出來:

SQL> select username, password_versions from dba_users where password_versions is not null;

USERNAME		       PASSWORD_VERSIONS
------------------------------ -----------------
SYS			       11G 12C
SYSTEM			       11G 12C
CTXSYS			       11G 12C

考慮到SYS使用者的特殊性,那麼這裡使用SYSTEM使用者再次測試觀察下:

sqlplus system/oracle@192.168.1.4/demo

同樣,報錯ORA-01017,輸入的密碼確認是沒問題的,使用高版本的客戶端,同樣的密碼測試連線也是OK的。

C:\Users\Alfred>sqlplus system/oracle@192.168.1.4/demo

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 22:10:02 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


請輸入使用者名稱:
C:\Users\Alfred>

修改system密碼:

SQL> select username, PASSWORD_VERSIONS, PASSWORD_CHANGE_DATE from dba_users where PASSWORD_VERSIONS is not null;

USERNAME		       PASSWORD_VERSIONS PASSWORD_
------------------------------ ----------------- ---------
SYS			       11G 12C		 04-JAN-23
SYSTEM			       11G 12C		 04-JAN-23
CTXSYS			       11G 12C		 04-JAN-23

SQL> alter user system identified by oracle;

User altered.

SQL> select username, PASSWORD_VERSIONS, PASSWORD_CHANGE_DATE from dba_users where PASSWORD_VERSIONS is not null;

USERNAME		       PASSWORD_VERSIONS PASSWORD_
------------------------------ ----------------- ---------
SYS			       11G 12C		 04-JAN-23
SYSTEM			       10G 11G 12C	 17-JAN-23
CTXSYS			       11G 12C		 04-JAN-23

SQL>

看來,SYSTEM使用者是比較正常顯示的,改過密碼後,PASSWORD_VERSIONS多了10G的顯示,符合我們預期。
此時,再嘗試從11.2.0.1的客戶端,對19c的服務端進行連線時,確認system使用者也可以成功連線了:

C:\Users\Alfred>sqlplus system/oracle@192.168.1.4/demo

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 22:15:23 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


連線到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL>

其他業務使用者,推斷應該都和system使用者的表現一致,這樣也符合邏輯。

這裡還觀察到一個細節:

修改密碼前,查詢SYS和SYSTEM使用者在user$中的password和spare4欄位:

select name, password, spare4 from user$ where name in ('SYS','SYSTEM')
SQL> /

NAME		PASSWORD	SPARE4
--------------- --------------- --------------------------------------------------------------------------------
SYS				S:88EB5B08A9EC6EBAE68148FB711CF9416C26077B3512B6A5BF8A1F44C610;T:4EDCFBAD9376CD1
				ACEBA5567ECA2877B386ED292DD993B57CEEC07261A0137141A5C43941265FC7FD7A540D9D3EED87
				1B6EB1733EEBC2AED5A63CF02F69AFEBC89F026B2D4430CE35D6CCCD5C5DA7123

SYSTEM				S:9CFB5871B12A3CF7E01D864BFE348D521B15B78DEF75B8C95C0EC661792B;T:52418514B24923B
				6C1CC3A609B293A413C5B71C5B2A270A97A71F5E2A2857CFCAE98ECE47B17A1149BAAFF268654082
				469B1078901B0B55CFD377987E2C5AFC598045FFCE551D42CBDE2D38418BDFBE6

修改密碼後,再次查詢:

SQL> select name, password, spare4 from user$ where name in ('SYS','SYSTEM') ;

NAME		PASSWORD	SPARE4
--------------- --------------- --------------------------------------------------------------------------------
SYS				S:88EB5B08A9EC6EBAE68148FB711CF9416C26077B3512B6A5BF8A1F44C610;T:4EDCFBAD9376CD1
				ACEBA5567ECA2877B386ED292DD993B57CEEC07261A0137141A5C43941265FC7FD7A540D9D3EED87
				1B6EB1733EEBC2AED5A63CF02F69AFEBC89F026B2D4430CE35D6CCCD5C5DA7123

SYSTEM		2D594E86F93B17A S:CAA7AFAE43C3D06D50F6272A837ACDF4C3A2D092821AD7076534CCEEE6F7;T:B8FCFE4B975D3D9
		1		86C1CD27A21FB6F78397BD97889B017FE2F6B949981E85E5F1208C42A143367C3EA70AF7B39B6193
				C38D171CEEF893EAF6FB87A5C095F864B6517CEA65522ACCDE592D9A645FEDC3A

發現SYS使用者在基表user$中也是沒有變化,但是SYSTEM使用者就比較正常了,而且會發現,SYSTEM使用者在PASSWORD欄位也有對應值了,這是因為PASSWORD_VERSIONS=10G版本時,是存在這個欄位的。

3.總結經驗

最後總結一下:

  • 1.低版本客戶端連線高版本資料庫,需要在服務端配置sqlnet.ora檔案;
  • 2.高版本資料庫的密碼需要重新設定(可以和之前密碼相同),確保PASSWORD_VERSIONS有低版本;
  • 3.不同PASSWORD_VERSIONS,在基表user$中儲存密碼的列也不一樣;
  • 4.測試做實驗強烈建議不要使用SYS這種特殊使用者,因為現象很可能不一致;建議使用SYSTEM或者最好自己新建測試使用者為佳。

相關文章