프린트 하기

OS환경 : Oracle Linux 5.8, 7.6 (64bit)

 

DB 환경 : Oracle Database 10.2.0.4, 19.11.0.0

 

에러 : ORA-28040: No matching authentication protocol

오라클 10g에서 19c로 접속하려할 때 발생하는 메세지

tnsnames.ora 파일에 19c 접속 정보를 넣은 상태에서

1
2
3
4
5
6
7
8
9
$ cat $ORACLE_HOME/network/admin/tnsnames.ora
ORCL19 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.60)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ORCL19)
    )
  )

 

 

tns를 이용해 19c 로 sqlplus 접속을 하려할 때 발생하는 메세지

1
2
3
4
5
6
7
8
9
10
11
$ sqlplus system/oracle@ORCL19
 
SQL*Plus: Release 10.2.0.5.0 - Production on Thu Dec 9 16:31:15 2021
 
Copyright (c) 19822010, Oracle.  All Rights Reserved.
 
ERROR:
ORA-28040: No matching authentication protocol
 
 
Enter user-name: 

 

 

해결 방법 : 19c db의 sqlnet.ora파일 설정

19c가 설치된 db서버에서 sqlnet.ora파일에 아래 문장 추가 

1
2
3
4
$ cd $ORACLE_HOME/network/admin
$ vi sqlnet.ora 
SQLNET.ALLOWED_LOGON_VERSION_SERVER=10
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=10

 

 

10g 서버에서 19c로 다시 접속시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sqlplus system/oracle@ORCL19
 
SQL*Plus: Release 10.2.0.5.0 - Production on Thu Dec 9 16:40:32 2021
 
Copyright (c) 19822010, Oracle.  All Rights Reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 
SYSTEM@ORCL19 > select instance_name, version, status from v$instance;
 
INSTANCE_NAME     VERSION       STATUS
---------------- ----------------- ------------
ORCL19         19.0.0.0.0       OPEN

정상적으로 접속됨

*1957995.1에 따르면 리스너 재기동은 필요없음

 

 

접속이 되지않는경우

19c 리스너 재기동

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
$ lsnrctl stop
 
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 09-DEC-2021 16:26:11
 
Copyright (c) 19912021, Oracle.  All rights reserved.
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ORACLE19)(PORT=1521)))
The command completed successfully
 
$ lsnrctl start
 
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 09-DEC-2021 16:26:12
 
Copyright (c) 19912021, Oracle.  All rights reserved.
 
Starting /app/oracle/product/19.0.0/bin/tnslsnr: please wait...
 
TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /app/oracle/product/19.0.0/network/admin/listener.ora
Log messages written to /app/oracle/diag/tnslsnr/ORACLE19/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ORACLE19)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
 
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ORACLE19)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                09-DEC-2021 16:26:12
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /app/oracle/product/19.0.0/network/admin/listener.ora
Listener Log File         /app/oracle/diag/tnslsnr/ORACLE19/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ORACLE19)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

 

 

19c 유저 패스워드 버전 확인

1
2
3
4
5
6
7
8
SQL> select username, PASSWORD_VERSIONS from dba_users;
 
USERNAME     PASSWORD_VERSIONS
-----------------------------
SYS             11G 12C
SYSTEM         11G 12C
.
.

 

 

19c 유저 패스워드 재설정(기존 패스워드 재입력)

1
2
3
SQL> alter user system identified by oracle;
 
User altered.

 

 

19c 유저 패스워드 버전 재확인

1
2
3
4
5
6
7
8
SQL> select username, PASSWORD_VERSIONS from dba_users;
 
USERNAME     PASSWORD_VERSIONS
-----------------------------
SYS               11G 12C
SYSTEM        10G 11G 12C
.
.

패스워드 버전이 11G 12C에서 10G 11G 12C로 변경됨

 

 

*sqlnet.ora 파일 설정 이후에 생성한 유저의 password_version은 모두 10G 11G 12C 로 설정됨

1
2
3
4
5
6
7
8
9
SQL> create user test2 identified by test2 account unlock;
 
User created.
 
SQL> select username, PASSWORD_VERSIONS from dba_users where username = 'TEST2';
 
USERNAME     PASSWORD_VERSIONS
-----------  --------
TEST2          10G 11G 12C

 

 

다시 sqlplus 접속시도

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sqlplus system/oracle@ORCL19
 
SQL*Plus: Release 10.2.0.5.0 - Production on Thu Dec 9 17:02:31 2021
 
Copyright (c) 19822010, Oracle.  All Rights Reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 
SYSTEM@ORCL19 > select instance_name, version, status from v$instance;
 
INSTANCE_NAME     VERSION       STATUS
---------------- ----------------- ------------
ORCL19         19.0.0.0.0       OPEN

정상적으로 접속됨

 

 

원인 : 클라이언트-db간 최소 인증 프로토콜 버전이 맞지 않아서 발생한 문제

낮은 버전의 db와 높은 버전의 db를 연결할때는 sqlnet.ora 파일에 위와같은 설정을 해주어야 정상적으로 접속됨

 

 

SQLNET.ALLOWED_LOGON_VERSION_CLIENT 값 설명

12a : Oracle Database 12 c 릴리스 1(12.1.0.2) 이상(가장 강력한 보호 기능)
참고 : 이 설정을 사용하면 클라이언트는 최적화되지 않은 암호 버전을 사용해서만 인증할 수 있습니다. 예를 들어 12C암호 버전입니다.
12 : 중요 패치 업데이트 CPUOct2012 이상 Oracle Database 11g 인증 프로토콜(강력한 보호)
메모:이 설정을 사용하면 클라이언트는 솔트를 사용하는 암호 해시 값을 통해서만 인증할 수 있습니다. 예를 들어 11G또는 12C암호 버전입니다.

11 : Oracle Database 11g 인증 프로토콜용(기본값)
10 : Oracle Database 10g 인증 프로토콜용
8 : Oracle8i 인증 프로토콜용

 

 

*참고사항

sqlnet.ora 파일 설정 전 후 리스너 로그확인

sqlnet.ora 파일 설정 전 tnsping 시 리스너 로그

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
10g -> 19c tnsping
$ tnsping orcl19
 
TNS Ping Utility for Linux: Version 10.2.0.5.0 - Production on 09-DEC-2021 17:07:06
 
Copyright (c) 1997,  2010, Oracle.  All rights reserved.
 
Used parameter files:
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.60)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL19)))
OK (0 msec)
 
19c 리스너로그
$ tail -/app/oracle/diag/tnslsnr/ORACLE19/listener/trace/listener.log
2021-12-09T17:02:15.528158+09:00
09-DEC-2021 17:02:15 * ping * 0

tnsping 성공하고 리스너로그에서 ping이 확인됨

 

 

sqlnet.ora 파일 설정 전 tns sqlplus 연결시 리스너 로그

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
10g -> 19c sqlplus
$ sqlplus system/oracle@ORCL19
 
SQL*Plus: Release 10.2.0.5.0 - Production on Thu Dec 9 17:09:04 2021
 
Copyright (c) 19822010, Oracle.  All Rights Reserved.
 
ERROR:
ORA-28040: No matching authentication protocol
 
 
Enter user-name: 
 
19c 리스너로그
$ tail -/app/oracle/diag/tnslsnr/ORACLE19/listener/trace/listener.log
2021-12-09T17:04:13.710042+09:00
09-DEC-2021 17:04:13 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL19)(CID=(PROGRAM=sqlplus)(HOST=ORACLE10)(USER=oracle))) * 
(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.20)(PORT=45315)) * establish * ORCL19 * 0

sqlplus 접속시 ORA-28040 발생하고 리스너로그에는 establish(서버에 접속성공)이 나타남

 

 

sqlnet.ora 파일 설정 후 tnsping 시 리스너 로그

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
10g -> 19c tnsping
$ tnsping orcl19
 
TNS Ping Utility for Linux: Version 10.2.0.5.0 - Production on 09-DEC-2021 17:11:38
 
Copyright (c) 1997,  2010, Oracle.  All rights reserved.
 
Used parameter files:
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.60)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL19)))
OK (0 msec)
 
19c 리스너로그
$ tail -/app/oracle/diag/tnslsnr/ORACLE19/listener/trace/listener.log
2021-12-09T17:06:47.429157+09:00
09-DEC-2021 17:06:47 * ping * 0

tnsping 성공하고 리스너로그에서 ping이 확인됨

sqlnet.ora 미설정시와 동일한 로그가 리스너로그에 남음

 

 

sqlnet.ora 파일 설정 후 tns sqlplus 연결시 리스너 로그

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
10g -> 19c sqlplus 
$ sqlplus system/oracle@ORCL19
 
SQL*Plus: Release 10.2.0.5.0 - Production on Thu Dec 9 17:12:20 2021
 
Copyright (c) 19822010, Oracle.  All Rights Reserved.
 
 
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
 
SYSTEM@ORCL19 > select instance_name, version, status from v$instance;
 
INSTANCE_NAME     VERSION       STATUS
---------------- ----------------- ------------
ORCL19         19.0.0.0.0       OPEN
 
19c 리스너로그
$ tail -/app/oracle/diag/tnslsnr/ORACLE19/listener/trace/listener.log
2021-12-09T17:07:29.641416+09:00
09-DEC-2021 17:07:29 * (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL19)(CID=(PROGRAM=sqlplus)(HOST=ORACLE10)(USER=oracle))) * 
(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.20)(PORT=45320)) * establish * ORCL19 * 0

sqlplus 접속시 정상 접속되고 리스너로그에는 establish(서버에 접속성공)이 나타남

sqlnet.ora 미설정시와 동일한 로그가 리스너로그에 남음

 

 

참조 : 2111876.1, 1556542.1, 1957995.1, 2040705.1

https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/parameters-for-the-sqlnet.ora.html#GUID-B2908ADF-0973-44A9-9B34-587A3D605BED

http://www.koreaoug.org/security/7837