OS 환경 : Oracle Linux 8.7 (64bit)
DB 환경 : Oracle Database 19.27.0.0
방법 : 오라클 19c ssl(tls)을 이용한 tns(tcps) 연결 설정
Oracle Database에서는 기본적으로 TCP 기반으로 클라이언트와 서버가 통신함
이 방식은 내부망에서는 문제가 없지만, 외부망 연동이나 보안 요구 수준이 높은 환경에서는 패킷 스니핑이나 중간자 공격 가능성이 존재함
이를 해결하기 위해 Oracle은 SSL/TLS를 이용한 TCPS 프로토콜을 제공하며, 네트워크 구간 전체를 암호화해 안전한 연결을 보장함
19c 버전에서도 표준 기반 TLS를 사용해 서버 인증, 암호화, 무결성을 확보할 수 있음
본문에서는 Oracle 19c 싱글db에서 SSL/TLS 기반 TCPS 연결을 구성하는 방법을 설명함
SSL/TLS 이란?
SSL/TLS는 인터넷에서 가장 널리 사용되는 보안 프로토콜이고 전송되는 데이터를 암호화해 제3자가 내용을 볼 수 없도록 보호하는 기술임
Oracle Database의 TCPS 프로토콜은 이러한 SSL/TLS 위에서 동작함
서버 인증과 데이터 암호화를 통해 안전한 네트워크 연결을 제공함
SSL은 원래 1990년대에 개발된 프로토콜이고 현대에는 더 강화된 버전인 TLS가 표준으로 사용됨
Oracle 19c는 기본적으로 TLS 1.2를 사용함, 서버 인증서 기반 검증과 암호화된 세션 생성 방식을 따름
핸드셰이크란?
핸드셰이크는 클라이언트와 서버가 TLS 연결을 시작할 때 수행하는 초기 협상 과정임
이 과정에서 암호화 방식, 서버 인증서 검증, 세션키 생성 등의 절차가 이루어지며
핸드셰이크가 성공해야 이후의 암호화된 데이터 통신이 시작됨
TCPS(SSL/TLS) 기반 Oracle Net 통신의 동작 방식
1. 서버 인증서 제시 및 클라이언트 검증
클라이언트는 서버가 제공한 인증서가 신뢰할 수 있는 CA로 서명되었는지 확인하고
DN(CN) 값이 접속하려는 서버와 일치하는지 검증하여 서버의 신뢰성을 확보함
2. TLS 핸드셰이크 기반 세션키 생성
초기 메시지는 서버의 공개키를 활용하는 비대칭 암호 기반으로 교환되며
이후에는 성능이 우수한 대칭키 기반 세션키로 암호화 통신을 수행함
3. Oracle Net 패킷 암호화 전송
SQL 요청, 결과 Fetch 등 모든 트래픽이 암호화되어 네트워크 스니핑이나 중간자 공격을 방지함
4. 단방향 TLS 및 mTLS 인증 방식 선택
단방향 TLS는 서버 인증서만 사용하여 서버 진위만 확인하며 mTLS는 클라이언트도 인증서를 제시해 서버가 클라이언트를 인증함
참고로
단방향은 SSL_CLIENT_AUTHENTICATION = FALSE로 설정하고
mTLS 방식은 SSL_CLIENT_AUTHENTICATION = TRUE로 설정함
5. TCPS 리스너 기반 TLS 암호화 연결 처리
listener.ora에서 (PROTOCOL=TCPS)를 지정하면 리스너가 해당 포트를 TLS 모드로 리스닝하며
클라이언트는 PROTOCOL=TCPS를 사용해 암호화된 세션을 형성함
테스트 서버 정보
db 서버 : 192.168.137.50
클라이언트 서버 : 192.168.137.60
테스트
1. 서버 Wallet 생성 및 인증서 준비
2. 클라이언트 Wallet 생성 및 인증서 준비
3. 클라이언트 network 파일 수정
4. 서버 network 파일 수정
5. 테스트 연결
테스트
1. 서버 Wallet 생성 및 인증서 준비
실제 운영에서는 사내 CA 또는 공인 CA에서 받은 서버 인증서를 쓰는 게 좋지만
본문에서는 바로 테스트 가능한 self-signed 인증서를 사용함
wallet용 경로 생성
|
1
2
|
$ mkdir -p /app/oracle/wallets/db
$ chmod 700 /app/oracle/wallets/db
|
서버 Wallet 생성 (auto-login 포함)
|
1
2
3
4
5
6
7
8
9
10
|
$ orapki wallet create \
-wallet /app/oracle/wallets/db \
-pwd "dnjffpt123!" \
-auto_login
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
|
self-signed 서버 인증서 생성
*참고로 CN에 들어가는 값은 클라이언트에서 붙을때도 저 값으로 붙여야함
*본문에는 ip를 넣었지만 만약 hostname을 넣어주는 경우 클라이언트 tnsnames.ora 및 월렛 등록시에도 동일한 값(hostname)을 넣어줘야함
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ orapki wallet add \
-wallet /app/oracle/wallets/db \
-dn "CN=192.168.137.50, OU=DB, O=Test, C=KR" \
-keysize 2048 \
-self_signed \
-validity 3650 \
-pwd "dnjffpt123!"
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
|
인증서 확인
|
1
2
3
4
5
6
7
8
9
10
|
$ orapki wallet display -wallet /app/oracle/wallets/db
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
Requested Certificates:
User Certificates:
Subject: CN=192.168.137.50,OU=DB,O=Test,C=KR
Trusted Certificates:
Subject: CN=192.168.137.50,OU=DB,O=Test,C=KR
|
참고용. 월렛 삭제 명령
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#User Certificate 삭제
$ orapki wallet remove \
-wallet /app/oracle/wallets/db \
-user_cert \
-dn "CN=192.168.137.50,OU=DB,O=Test,C=KR" \
-pwd "dnjffpt123!"
#Trusted Certificate 삭제
$ orapki wallet remove \
-wallet /app/oracle/wallets/db \
-trusted_cert \
-dn "CN=192.168.137.50,OU=DB,O=Test,C=KR" \
-pwd "dnjffpt123!"
#월렛 경로 자체 삭제(모두 삭제)
$ rm -f /app/oracle/wallets/db/*
|
서버에서 인증서 추출
|
1
2
3
4
5
6
7
8
9
10
11
|
$ orapki wallet export \
-wallet /app/oracle/wallets/db \
-dn "CN=192.168.137.50, OU=DB, O=Test, C=KR" \
-cert /tmp/`hostname`-certificate.cer \
-pwd "dnjffpt123!"
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.4.0.0.0
Copyright (c) 2004, 2025, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
|
추출한 인증서 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$ cat /tmp/`hostname`-certificate.cer
-----BEGIN CERTIFICATE-----
MIIDBTCCAe0CEEj5J/q92MV+cxxxxxxxcQYJKoZIhvcNAQELBQAwQTELMAkG
A1UEBhMCS1IxDTALBgNVBAoTcxxxxxxxcgNVBAsTAkRCMRYwFAYDVQQDEw0x
MC43MC4xMDEuMTU1MB4XDTI1cxxxxxxxcFoXDTM1MTEyNjAwMjQ0NFowQTEL
MAkGA1UEBhMCS1IxDTALBgNVcxxxxxxxczAJBgNVBAsTAkRCMRYwFAYDVQQD
Ew0xMC43MC4xMDEuMTU1MIIBcxxxxxxxcw0BAQEFAAOCAQ8AMIIBCgKCAQEA
oRtLBYERGtHe0p7ib3sPq2QbcxxxxxxxcQbI5ZTRIKxMR9x5tP7PI/UBWbl2
QFbBhKLDTJyqSL1o1ydDsUWRcxxxxxxxcPa+pHorOSB2C1Nq8Q9c0bstXnM0
R0m2sjVNYXNaQaJukyGr1EZocxxxxxxxcOx7SA13K36YglsbseSmt6IlYAke
WmQlMUzewqcQxa80CCr/vk5hcxxxxxxxctwXsnlcofqjbFyJ8be6f/sx2695
T2QwlNAQtm6CwspAEUSy9TtpcxxxxxxxclNOgiHcpUws+K71EzW3NcXQ/Xxt
visMa6PK9HTdkwbtoUsnDwIDcxxxxxxxcIb3DQEBCwUAA4IBAQAoJWNDo3Ws
Pv2pfq1Y8H17AnSG/cI9g0VVcxxxxxxxcgMLYS+Mgje1EEUrK3z6IgJ67HaH
+120fE7/+dhp7C4Ga5CC6nMDcxxxxxxxcP3juHwnFaFg0/esp2KkvjhORcON
qhuI3EDi1iAozBZ/VFMkBFjWcxxxxxxxclNz9EYh2UO7pZ3JAMPTqX4vChZf
iX167nBuCPcLGlvXgHt6jI+ccxxxxxxxcr4X9AE5xRXjxhSb4Px65EI9XVDt
WBqnYXIepSxbHez28oVd9PWZcxxxxxxxcnzWustsaoPRHgcIDAhQXLYLbSfn
qDoCSB1u+1iq
-----END CERTIFICATE-----
|
해당 인증서를 클라이언트 서버로 전송
|
1
2
|
$ scp /tmp/`hostname`-certificate.cer 192.168.137.60:/tmp/
ora19fs-certificate.cer 100% 1106 1.4MB/s 00:00
|
2. 클라이언트 Wallet 생성 및 인증서 준비
서버 인증서를 CA가 서명한 경우 클라이언트 OS가 해당 CA 루트/중간 인증서를 이미 신뢰한다면 "walletless TLS" 구성이 가능하고, 별도의 client wallet 없이도 TLS 접속이 가능하다고함
본문에서는 클라이언트도 Oracle Wallet을 사용하는 방식으로 진행함
클라이언트 wallet용 경로 생성
|
1
2
|
$ mkdir -p /app/oracle/wallets/client
$ chmod 700 /app/oracle/wallets/client
|
클라이언트 Wallet 생성 (auto-login 포함)
|
1
2
3
4
5
6
7
8
9
10
|
$ orapki wallet create \
-wallet /app/oracle/wallets/client \
-pwd "dnjffpt123!" \
-auto_login
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
|
client wallet에 trust 추가
|
1
2
3
4
5
6
7
8
9
10
11
|
$ orapki wallet add \
-wallet /app/oracle/wallets/client \
-trusted_cert \
-cert /tmp/ora19fs-certificate.cer \
-pwd "dnjffpt123!"
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
|
인증서 확인
|
1
2
3
4
5
6
7
8
9
|
$ orapki wallet display -wallet /app/oracle/wallets/client
Oracle PKI Tool Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
Copyright (c) 2004, 2019, Oracle and/or its affiliates. All rights reserved.
Requested Certificates:
User Certificates:
Trusted Certificates:
Subject: CN=192.168.137.50,OU=DB,O=Test,C=KR
|
3. 클라이언트 network 파일 수정
sqlnet.ora 파일 수정
|
1
2
3
4
5
6
7
8
9
|
$ vi $ORACLE_HOME/network/admin/sqlnet.ora
#추가
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /app/oracle/wallets/client)
)
)
|
tnsnames.ora 파일 수정
|
1
2
3
4
5
6
7
8
9
10
|
$ vi $ORACLE_HOME/network/admin/tnsnames.ora
#추가
ORA19SG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.137.50)(PORT = 2484))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORA19SG)
)
)
|
4. 서버 network 파일 수정
sqlnet.ora 파일 수정
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ vi $ORACLE_HOME/network/admin/sqlnet.ora
#추가
SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCP, TCPS)
SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /app/oracle/wallets/db)
)
)
|
리스너 파일 수정
|
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
|
$ vi $ORACLE_HOME/network/admin/listener.ora
#기존
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora19fs)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
#변경
SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /app/oracle/wallets/db)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora19fs)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.137.50)(PORT = 2484))
)
)
|
리스너 및 db 재기동
*오라클 메뉴얼에는 cluster db의 경우 db까지 재기동해야 한다고 나와있지만, 싱글db에 대해서는 db 재기동이 필요하다고 되어있지 않아서 리스너만 재기동함
|
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
|
$ lsnrctl stop
$ lsnrctl start
$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 29-NOV-2025 12:51:09
Copyright (c) 1991, 2025, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora19fs)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 29-NOV-2025 12:50:04
Uptime 0 days 0 hr. 1 min. 5 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /app/oracle/product/19c/network/admin/listener.ora
Listener Log File /app/oracle/diag/tnslsnr/ora19fs/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora19fs)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.137.50)(PORT=2484)))
Services Summary...
Service "ORA19SG" has 1 instance(s).
Instance "ORA19SG", status READY, has 1 handler(s) for this service...
Service "ORA19SGXDB" has 1 instance(s).
Instance "ORA19SG", status READY, has 1 handler(s) for this service...
The command completed successfully
|
5. 테스트 연결
클라이언트 -> 서버 연결 테스트
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$ sqlplus system/oracle@ORA19SG
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 29 13:16:06 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Wed Nov 26 2025 22:14:43 +09:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.0.0
SQL> select instance_name, status, version from v$instance;
INSTANCE_NAME STATUS VERSION
---------------- ------------ -----------------
ORA19SG OPEN 19.0.0.0.0
|
연결 정보 확인
|
1
2
3
4
5
6
7
|
SQL>
col protocol for a10
select sys_context('userenv','network_protocol') as protocol from dual;
PROTOCOL
---------
tcps
|
tcps로 붙음
참고1. 일반 방식으로 접속 후 확인하면 프로토콜이 tcp로 표시됨
일반 방식으로 접속 후 연결 정보 확인
|
1
2
3
4
5
6
7
|
SQL>
col protocol for a10
select sys_context('userenv','network_protocol') as protocol from dual;
PROTOCOL
---------
tcp
|
tcp로 붙음
참고2. 클라이언트에서 월렛 경로 제거시
클라이언트에서 월렛 경로 제거
|
1
|
$ rm -rf /app/oracle/wallets/client/
|
클라이언트 -> 서버 연결 테스트
|
1
2
3
4
5
6
7
8
9
10
11
12
|
$ sqlplus system/oracle@ORA19SG
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 29 13:52:38 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-28759: failure to open file
Enter user-name:
|
ORA-28759 에러 메세지가 발생함, 월렛을 열지 못해서 생기는 오류로 보임
이상태에서 tnsping 시도
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ tnsping ORA19SG
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 29-NOV-2025 13:53:30
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/app/oracle/product/19c/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.137.50)(PORT = 2484)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORA19SG)))
TNS-12560: TNS:protocol adapter error
|
tnsping도 TNS-12560 에러가 발생하면서 안감
본문절차처럼 다시 Wallet 생성 후 인증서를 추가해주면 정상적으로 접속됨
참고3. tcp방식과 tcps 방식 tnsping 속도 비교
tnsnames.ora에 두가지 모두 등록
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$ cat $ORACLE_HOME/network/admin/tnsnames.ora
ORA19SG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.137.50)(PORT = 2484))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORA19SG)
)
)
ORA19SG_NORMAL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.50)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORA19SG)
)
)
|
tnsping 확인
tcp 방식 tnsping
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ tnsping ora19sg_normal
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 28-NOV-2025 14:13:24
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/app/oracle/product/19c/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.50)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORA19SG)))
OK (0 msec)
|
tcps 방식 tnsping
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
$ tnsping ora19sg
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 28-NOV-2025 14:13:27
Copyright (c) 1997, 2019, Oracle. All rights reserved.
Used parameter files:
/app/oracle/product/19c/network/admin/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.137.50)(PORT = 2484)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORA19SG)))
OK (50 msec)
|
여러번 수행했지만 tcps 방식이 매번 50 msec씩 소요됨, tcp 방식은 0 msec 소요됨
TLS 핸드셰이크(Handshake) 단계가 추가되서 조금 더 느린듯 함
참고4. 서버 리스너에 tcps 방식만 남겨둘 경우 테스트
서버 리스너에 tcps 방식만 놔두고 tcp 부분은 주석 처리 후 리스너 재기동
|
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
|
$ cat listener.ora
SSL_CLIENT_AUTHENTICATION = FALSE
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /app/oracle/wallets/db)
)
)
LISTENER =
(DESCRIPTION_LIST =
# (DESCRIPTION =
# (ADDRESS = (PROTOCOL = TCP)(HOST = ora19fs)(PORT = 1521))
# (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
# )
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.137.50)(PORT = 2484))
)
)
$ lsnrctl stop
$ lsnrctl start
$ lsnrctl status
|
로컬리스너도 설정(서버에서 설정)
|
1
2
3
4
5
6
7
8
9
10
|
$ cat tnsnames.ora
#추가
ORA19SG_SSL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 192.168.137.50)(PORT = 2484))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORA19SG)
)
)
|
로컬리스너 파라미터 설정 및 register(서버에서 설정)
|
1
2
3
4
5
6
7
|
SQL> alter system set local_listener = ORA19SG_SSL;
System altered.
SQL> alter system register;
System altered.
|
리스너 확인시 서비스가 안붙어서 db까지 재기동 하니 이후 서비스 붙음
|
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
|
$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 29-NOV-2025 14:08:45
Copyright (c) 1991, 2025, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=192.168.137.50)(PORT=2484)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 29-NOV-2025 13:55:57
Uptime 0 days 0 hr. 12 min. 48 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /app/oracle/product/19c/network/admin/listener.ora
Listener Log File /app/oracle/diag/tnslsnr/ora19fs/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=192.168.137.50)(PORT=2484)))
Services Summary...
Service "ORA19SG" has 1 instance(s).
Instance "ORA19SG", status READY, has 1 handler(s) for this service...
Service "ORA19SGXDB" has 1 instance(s).
Instance "ORA19SG", status READY, has 1 handler(s) for this service...
The command completed successfully
|
이상태에서 클라이언트에서 서버로 접속 시도
|
1
2
3
4
5
6
7
8
9
10
11
12
|
$ sqlplus system/oracle@ORA19SG_NORMAL
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 29 14:28:20 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-12541: TNS:no listener
Enter user-name: ^C
|
TCP 통신으로 접속시 ORA-12541 리스너가 없다는 에러가 발생함
TCPS 통신으로 접속시 정상 접속됨
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ sqlplus system/oracle@ORA19SG
SQL*Plus: Release 19.0.0.0.0 - Production on Sat Nov 29 14:28:23 2025
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Last Successful login time: Sat Nov 29 2025 13:52:07 +09:00
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.27.0.0.0
SQL> (정상접속됨)
|
참고5. rac의 경우 방식이 약간 다름
셀프 인증서만으로는 안되고 루트 CA 인증서가 필요함
Listener 인증서, SCAN Listener 인증서, DB Node 인증서 모두 동일한 Root CA에서 서명됨
클라이언트도 Root CA만 trust 등록하면 다중 노드를 신뢰할 수 있음
이부분은 추가 게시글을 작성 예정임
참고링크 : https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-17C00E86-780B-4B4C-91D7-76BC8BC7CE4F
결론 :
오라클에서는 기본적으로 TCP 기반으로 통신하지만 외부망 연동이나 보안 요건이 높은 환경에서는 TLS 기반 TCPS 구성을 고려할 수 있음
19c에서는 TLS 1.2를 지원하여 Wallet 기반 인증서 등록을 통해 안전한 암호화 채널을 구축할 수 있음
본문에서는 self-signed 인증서를 이용해 싱글 인스턴스 환경에서 TCPS 연결을 구성하였지만 RAC 환경은 루트 CA 인증서를 이용해야함
TCPS 연결 구성을 해놓은 상태에서 wallet 삭제 또는 설정 오류 시 TCPS 연결이 안될수 있음
TCPS 연결은 handshake 과정으로 인해 약간의 지연(테스트 결과 tnsping 기준 50ms 수준)이 발생함
자주 연결을 맺고 끊는 AP 환경이라면 handshake 과정으로 인해 지연을 느낄수도 있을듯하지만 WAS 같이 커넥션을 계속 맺어놓고 재사용하는 경우라면 크게 지연을 못느끼지 않을까 싶음(확실하게는 느려지는지는 테스트를 해봐야 알수 있을듯함)
참조 :
https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html
https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-9EB5CE4D-AEDD-438F-A08B-60F7FC276BA0
https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-secure-sockets-layer-authentication.html#GUID-32A5647F-D07E-470F-99DC-7113BC08F11B
https://oracle-base.com/articles/misc/configure-tcpip-with-ssl-and-tls-for-database-connections
https://royce-fu.com/blog/oracle-database-ssl-tls-1.2-client-server/
'ORACLE > Admin' 카테고리의 다른 글
| 오라클 26ai 버전명 변경사항 (0) | 2025.12.08 |
|---|---|
| 오라클 19c SQL Plan Management(SPM) 및 Automatic SPM(19.22부터) 무료 (0) | 2025.12.06 |
| 오라클 19c varchar2 최대 길이 32767로 변경 (1) | 2025.12.01 |
| 오라클 19c expdp impdp 상태 n초마다 자동 확인 (0) | 2025.11.24 |
| 오라클 19c 정적 리스너 이용하여 원격지 db에 접속 및 재시작 (0) | 2025.11.22 |