2026년 09월 15일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-12650 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-12650 No common encryption or data integrity algorithm 는?
ORA-12650 에러는 Oracle Net(SQLNet) 통신 과정에서 클라이언트와 서버 간에 공통으로 지원하는 암호화(Encryption) 알고리즘 또는 데이터 무결성(Data Integrity) 알고리즘이 존재하지 않을 때 발생합니다. 즉, 클라이언트 측 sqlnet.ora 파일과 서버 측 sqlnet.ora 파일에 설정된 알고리즘 목록이 서로 맞지 않아 협상(Negotiation)이 실패하는 상황입니다. 이 에러는 Oracle Advanced Security Option(ASO)을 사용하는 환경에서 특히 자주 발생하며, 보안 정책 강화 이후 갑자기 접속이 안 되는 형태로 운영 현장에 나타나는 경우가 많습니다.
주요 발생 원인
1. 클라이언트와 서버 간 암호화 알고리즘 설정 불일치
가장 흔한 원인으로, 서버의 sqlnet.ora에는 특정 알고리즘(예: AES256)만 허용하도록 설정되어 있는데, 클라이언트의 sqlnet.ora에는 전혀 다른 알고리즘(예: 3DES112)만 명시되어 있는 경우입니다. Oracle Net은 양측이 공통으로 지원하는 알고리즘을 협상하는데, 교집합이 없으면 ORA-12650이 발생합니다. 이 문제는 보안 정책 변경 또는 Oracle 패치 적용 이후 설정이 달라진 경우에 특히 많이 나타납니다.
2. SQLNET.ENCRYPTION_SERVER / SQLNET.ENCRYPTION_CLIENT 파라미터의 REQUIRED 설정 충돌
서버 혹은 클라이언트 한쪽이 REQUIRED로 설정되어 있으나 상대방이 REJECTED로 설정된 경우 협상 자체가 불가능해집니다. 예를 들어, 서버에서 암호화를 REQUIRED로 강제하는데 클라이언트가 REJECTED로 암호화를 거부하면 연결이 즉시 끊어집니다. 이 설정은 ACCEPTED, REJECTED, REQUESTED, REQUIRED 네 가지 값을 가지며, 조합에 따라 협상 성공 여부가 달라집니다.
3. Oracle 버전 업그레이드 또는 패치 이후 기본 지원 알고리즘 변경
Oracle 19c 이후부터는 보안 강화 차원에서 일부 구형 알고리즘(DES, 3DES, MD5 등)이 기본적으로 비활성화되거나 deprecated 처리되었습니다. 클라이언트가 구버전 Oracle Client를 사용하고 있을 경우, 서버가 지원하지 않는 알고리즘만 제공하게 되어 ORA-12650이 발생할 수 있습니다. 특히 Oracle 11g 클라이언트로 Oracle 19c 이상의 서버에 접속하는 레거시 환경에서 자주 목격됩니다.
해결 방법
원인 1 해결: 알고리즘 목록 일치시키기
서버와 클라이언트의 sqlnet.ora 파일에서 공통 알고리즘을 확인하고 통일합니다.
아래는 서버 측 $ORACLE_HOME/network/admin/sqlnet.ora 예시입니다:
-- 서버 측 sqlnet.ora 설정 예시
-- 암호화 알고리즘 목록 설정 (서버)
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128, 3DES168)
SQLNET.ENCRYPTION_SERVER = REQUESTED
-- 데이터 무결성 알고리즘 목록 설정 (서버)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUESTED
클라이언트 측 sqlnet.ora도 동일하게 맞춰줍니다:
-- 클라이언트 측 sqlnet.ora 설정 예시
SQLNET.ENCRYPTION_TYPES_CLIENT = (AES256, AES192, AES128, 3DES168)
SQLNET.ENCRYPTION_CLIENT = REQUESTED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT = (SHA256, SHA1)
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUESTED
설정 변경 후 Oracle Listener를 재시작하고 접속을 재시도합니다:
-- Listener 재시작 명령 (OS 레벨)
-- lsnrctl stop
-- lsnrctl start
-- 현재 세션의 암호화 상태 확인 쿼리
SELECT SYS_CONTEXT('USERENV', 'NETWORK_PROTOCOL') AS protocol,
SYS_CONTEXT('USERENV', 'SESSION_USER') AS session_user
FROM DUAL;
-- V$SESSION_CONNECT_INFO를 통한 암호화 정보 확인
SELECT sid,
network_service_banner
FROM v$session_connect_info
WHERE sid = SYS_CONTEXT('USERENV', 'SID');
원인 2 해결: REQUIRED/REJECTED 충돌 해소
아래와 같이 양쪽 모두 REQUESTED 또는 ACCEPTED로 설정하면 협상이 유연하게 이루어집니다:
-- 서버 측 권장 설정 (강제하지 않되 지원 가능)
SQLNET.ENCRYPTION_SERVER = ACCEPTED
SQLNET.CRYPTO_CHECKSUM_SERVER = ACCEPTED
-- 클라이언트 측 권장 설정
SQLNET.ENCRYPTION_CLIENT = REQUESTED
SQLNET.CRYPTO_CHECKSUM_CLIENT = REQUESTED
협상 매트릭스 참고:
| 서버 설정 | 클라이언트 설정 | 결과 |
|————-|—————–|————|
| REQUIRED | REJECTED | ❌ 실패 |
| REQUIRED | ACCEPTED | ✅ 성공 |
| REQUESTED | REJECTED | ✅ 성공 |
| ACCEPTED | REQUESTED | ✅ 성공 |
원인 3 해결: 구버전 클라이언트 호환성 처리
서버에서 구형 알고리즘을 임시로 허용하되, 장기적으로는 클라이언트 업그레이드를 권장합니다:
-- 서버 측 sqlnet.ora에 구형 알고리즘 임시 추가 (레거시 클라이언트 지원용)
-- ※ 보안 위험이 있으므로 임시 조치로만 사용할 것
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128, 3DES168, 3DES112)
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256, SHA1, MD5)
-- 현재 DB에 연결된 클라이언트 버전 확인
SELECT DISTINCT client_version,
count(*) AS cnt
FROM v$session
WHERE client_version IS NOT NULL
GROUP BY client_version
ORDER BY cnt DESC;
예방 방법
1. sqlnet.ora 표준 템플릿 관리 및 형상 관리 시스템 적용
서버와 클라이언트 양측의 sqlnet.ora 파일을 Git 등 형상 관리 시스템으로 관리하고, 변경 시 반드시 양측의 알고리즘 목록 호환성을 사전 검토합니다. 신규 Oracle 패치나 버전 업그레이드 전에는 반드시 테스트 환경에서 암호화 협상 테스트를 수행하는 절차를 표준화하세요. 또한 DBA 팀 내에서 sqlnet.ora 변경 시 변경 관리 프로세스를 의무화하여 단독 수정을 방지해야 합니다.
2. 정기적인 Oracle Net 설정 감사 스크립트 운영
아래 쿼리를 정기적(주 1회 이상)으로 실행하여 현재 접속 중인 세션의 암호화 현황을 모니터링하세요. 암호화가 적용되지 않은 세션이 존재할 경우 즉시 원인을 파악하고 보안 정책을 점검합니다.
-- 접속 세션별 네트워크 암호화 현황 모니터링
SELECT s.sid,
s.serial#,
s.username,
s.machine,
s.program,
sci.network_service_banner
FROM v$session s
JOIN v$session_connect_info sci ON s.sid = sci.sid
WHERE s.username IS NOT NULL
AND sci.network_service_banner LIKE '%Encryption%'
ORDER BY s.sid;
-- 암호화 미적용 세션 탐지 (보안 감사용)
SELECT s.sid,
s.username,
s.machine,
s.logon_time
FROM v$session s
WHERE s.username IS NOT NULL
AND s.sid NOT IN (
SELECT sid
FROM v$session_connect_info
WHERE network_service_banner LIKE '%Encryption service%'
)
ORDER BY s.logon_time;
관련 에러
- ORA-12660:
Encryption or crypto-checksumming parameters incompatible— 암호화 파라미터 자체가 호환되지 않을 때 발생하며, ORA-12650과 함께 나타나는 경우가 많습니다. - ORA-12659:
Error received from other process during protocol exchange— 알고리즘 협상 과정에서 상대방 프로세스로부터 에러를 수신한 경우로, ORA-12650의 연쇄 에러로 자주 등장합니다. - ORA-28865:
SSL connection closed— SSL/TLS 기반 암호화 사용 시 인증서 또는 알고리즘 불일치로 발생하며, Advanced Security 설정과 함께 점검이 필요합니다. - ORA-12537:
TNS:connection closed— 암호화 협상 실패로 인해 연결 자체가 종료될 때 최종적으로 나타나는 에러입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.