· 문제 해결 · 약 10분

V2Ray TLS 핸드셰이크 실패·인증서 오류 해결: 시스템 시간과 SNI 설정 점검

V2Ray TLS 인증서 오류의 주요 원인인 시스템 시간, SNI·도메인 불일치, allowInsecure 설정을 확인하고 오류별 해결 방법을 안내합니다.

이 글 미리 보기

v2rayN 데스크톱 클라이언트, v2rayNG 및 v2flyNG 안드로이드 클라이언트에서 TLS 노드에 연결할 때 발생하는 핸드셰이크·인증서 오류를 다룹니다. 먼저 코어 로그로 실패 단계를 확인한 뒤 시스템 시간, 노드 주소, SNI, 인증서 체인, 서버 수신 설정을 차례로 점검하세요. 인증서 검증을 건너뛰는 방식은 해결책이 아닙니다. 일반 TLS와 REALITY 설정도 구분해 설명하므로 두 설정을 혼동하지 마세요.

1. 연결 과정 중 어느 단계에서 오류가 나는지 확인

v2rayN은 데스크톱 클라이언트 인터페이스이며, 실제 연결을 설정하고 TLS 오류를 기록하는 것은 실행된 프록시 코어입니다. v2rayNG는 Xray 코어를, v2flyNG는 V2Fly 코어를 사용합니다. 코어와 버전에 따라 로그 문구는 다를 수 있지만 점검 순서는 대체로 같습니다. 먼저 구독 다운로드, 노드의 아웃바운드 연결, 브라우저에서 접속한 웹사이트 중 어디에서 실패했는지 확인하세요.

노드 주소 확인 대상 포트에 연결 핸드셰이크 매개변수 전송 서버 인증서 검증 프록시 세션 설정

‘구독 업데이트’ 중 인증서 오류가 표시되면 먼저 구독 주소의 HTTPS 서비스를 확인하세요. 이때 특정 노드의 SNI를 바꿔도 대개 해결되지 않습니다. 브라우저에서만 웹사이트 인증서 오류가 표시되고 코어 로그에 노드 아웃바운드 연결 성공이 기록된다면 대상 웹사이트, 로컬 HTTPS 검사 프로그램 또는 네트워크 로그인 페이지를 확인하세요. 노드 인증서 문제라고 단정할 수는 없습니다.

2. 로그의 오류 키워드에 따라 점검 방향 선택

로그와 그대로 비교할 수 있도록 자주 나타나는 영어 오류 문구를 유지했습니다. 도메인, 날짜, 주소는 환경에 따라 달라지므로 로그 한 줄 전체가 똑같을 필요는 없습니다. 한 번에 한 가지 설정만 바꾸고 저장한 뒤 다시 연결해 가장 안쪽의 오류가 바뀌었는지 확인하세요.

오류: x509: certificate has expired or is not yet valid

원인 및 해결: 기기의 현재 시간이 인증서 유효 기간을 벗어났을 수 있습니다. 기기 시계가 잘못되었거나 서버 인증서가 만료된 경우입니다. 먼저 기기 시간을 동기화한 다음 로그에 표시된 유효 기간을 확인하세요. 시간이 맞는데도 오류가 계속되면 서버에서 인증서를 갱신하고 새 인증서를 적용해야 합니다.

오류: x509: certificate is valid for …, not …

원인 및 해결: 인증서에 포함된 이름과 클라이언트가 확인하려는 이름이 일치하지 않습니다. 노드 SNI, 인증서의 SAN 도메인, 서버 가상 호스트 설정을 확인하세요. 노드 IP를 인증서 도메인으로 간주하면 안 됩니다.

오류: x509: certificate signed by unknown authority

원인 및 해결: 클라이언트가 신뢰할 수 있는 인증서 체인을 만들지 못한 상태입니다. 중간 인증서 누락, 자체 서명 인증서, 기기의 인증서 저장소 문제 등이 원인일 수 있습니다. 공인 인증서를 사용하는 서비스는 인증서 체인을 빠짐없이 제공해야 합니다. 사설 서비스를 운영한다면 정해진 보안 절차에 따라 신뢰할 수 있는 루트 인증서를 배포하세요.

오류: remote error: tls: handshake failure

원인 및 해결: 상대 서버가 핸드셰이크를 거부했지만, 이 로그 한 줄만으로 구체적인 원인을 알 수는 없습니다. 서버 로그에서 SNI, TLS 버전, 클라이언트 인증서 요구 여부, 수신 프로토콜을 확인하고 요청이 올바른 서비스에 도달했는지도 점검하세요.

오류: tls: first record does not look like a TLS handshake

원인 및 해결: 연결한 포트에서 TLS가 아닌 데이터가 반환되었습니다. 해당 포트가 실제로 TLS를 제공하는지, 리버스 프록시와 포트 전달 규칙이 트래픽을 평문 서비스로 보내고 있지는 않은지 확인하세요.

EOF와 connection reset by peer만으로 SNI 오류라고 단정할 수는 없습니다. 연결이 종료되거나 초기화되었다는 뜻이므로 서버 접속 로그, 포트 연결 상태, 같은 노드를 다른 네트워크에서 사용한 결과를 함께 확인해 원인을 좁히세요.

3. 시스템 시간 차이: 먼저 동기화한 뒤 인증서 유효 기간 확인

TLS는 기기의 실제 시스템 시간을 기준으로 인증서가 유효 기간 안에 있는지 확인합니다. 인증서 발급일보다 시간이 이르거나 만료일을 지난 경우 검증이 실패합니다. 표시된 시간대가 잘못되었다고 해서 시스템 타임스탬프까지 잘못된 것은 아닙니다. 자동 동기화 결과와 실제 날짜를 확인하고, 시간대를 다른 지역으로 바꾸는 데 그치지 마세요.

  1. 시간 설정 열기

    Windows 11에서는 ‘설정’ → ‘시간 및 언어’ → ‘날짜 및 시간’으로 이동해 연도, 날짜, 시간을 확인하세요. 다른 데스크톱 운영체제에서는 시스템 설정의 날짜 및 시간 화면을 여세요.

  2. 자동 동기화 실행

    ‘시간 자동 설정’을 켜고 ‘추가 설정’에서 ‘지금 동기화’를 누르세요. 동기화에 실패하면 먼저 네트워크와 시간 서비스에 연결할 수 있는지 확인하세요. 시간을 수동으로 계속 바꾸며 시험하지 마세요.

  3. 안드로이드 시간 확인

    안드로이드에서 ‘설정’을 열고 ‘날짜 및 시간’을 검색한 뒤 ‘시간 자동 설정’과 자동 시간대 옵션을 켜세요. 상위 메뉴 이름은 기기에 따라 ‘시스템’ 또는 ‘추가 설정’일 수 있으므로 설정 검색 결과를 기준으로 확인하세요.

  4. 연결 다시 설정

    클라이언트 연결을 중지했다가 다시 시작하고 한 번 더 접속해 보세요. 유효 기간 오류가 계속되면 로그의 현재 시간과 인증서 시작일·만료일을 비교해 서버에서 인증서를 갱신해야 하는지 확인하세요.

443
자주 사용하는 TLS 서버 포트. 노드의 실제 설정을 기준으로 확인하세요
123 / UDP
NTP에서 자주 사용하는 포트이며 프록시 노드 포트가 아닙니다
TLS 1.2 / 1.3
자주 사용하는 TLS 버전이며 클라이언트 버전 번호가 아닙니다

기기를 끌 때마다 날짜가 몇 년 전으로 돌아간다면 하드웨어 시계, 배터리 또는 시스템 시간 서비스를 확인하세요. 기기 시간은 정상인데 여러 기기에서 같은 노드의 인증서 만료 오류가 발생한다면 각 기기의 보안 옵션을 바꾸기보다 서버 인증서를 확인하는 것이 좋습니다.

4. SNI, 노드 주소, Host: 세 항목을 각각 확인

노드 주소는 연결할 호스트를 지정합니다. SNI는 TLS 핸드셰이크에서 전송하는 서버 이름으로, 서버는 이를 바탕으로 사이트와 인증서를 선택할 수 있습니다. 일반 TLS 설정의 serverName은 보통 인증서 이름 검증에도 사용됩니다. WebSocket의 Host는 HTTP 요청 헤더에 속하며 다른 계층에서 작동합니다. 세 항목이 모두 도메인처럼 보인다고 해서 반드시 같은 값이어야 하는 것은 아닙니다.

항목기능확인할 사항
주소 및 포트실제 연결 지점 지정도메인 조회, 포트 수신 여부, 트래픽 전달 대상
SNI / serverNameTLS 가상 호스트 선택. 일반적으로 인증서 검증 이름으로 사용서버 설정 및 인증서 SAN과 일치하는지
WebSocket HostHTTP 가상 호스트 또는 라우팅 규칙 선택리버스 프록시가 수신하는 Host와 일치하는지
WebSocket PathHTTP 요청 경로 지정대소문자와 앞쪽 슬래시가 서버 설정과 일치하는지

v2rayN 메인 화면에서 해당 노드를 더블 클릭해 편집 창을 여세요. TLS 영역에서 ‘SNI’ 또는 ‘ServerName’ 항목을 찾아 서비스 제공자가 안내한 값과 비교합니다. 버전에 따라 항목 이름이 조금 다를 수 있습니다. v2rayNG와 v2flyNG에서는 노드 편집 메뉴에서 해당 TLS 매개변수를 확인하세요. 먼저 기존 값을 기록하고 주소, 포트, SNI, 전송 방식은 한꺼번에 바꾸지 마세요.

5. allowInsecure와 인증서 체인: 검증을 복구하고 오류를 우회하지 마세요

allowInsecure는 코어 TLS 설정에서 인증서 검증을 건너뛸 때 사용하는 옵션입니다. 이 옵션을 켜면 도메인 불일치, 인증서 만료, 신뢰 체인 오류가 당장은 연결을 막지 않을 수 있지만, 연결 성공이 상대 서버의 신원을 보장하지는 않습니다. 일반 공용 TLS 노드에서는 인증서 검증을 켜 둔 상태로 실제 인증서 문제를 해결하세요.

같은 노드에서 오래된 기기 한 대만 unknown authority 오류가 나고 새 기기에서는 정상이라면 오래된 기기의 시스템 업데이트와 인증서 저장소를 확인하세요. 다만 서버에서 중간 인증서가 빠졌거나 다른 기기에 해당 인증서가 캐시되어 있을 가능성도 살펴봐야 합니다. 보안 프로그램의 HTTPS 검사로 발급자가 달라질 수도 있으므로 모든 보호 기능을 끄기보다 조직의 보안 정책에 따라 확인하세요.

6. 명령어로 포트 연결 문제와 TLS 설정 오류 구분

아래 명령은 권한이 있는 일반 TLS 서비스를 점검할 때만 사용하세요. 예시 도메인은 실제 노드 주소와 SNI로 바꾸고 포트도 노드의 실제 값으로 입력해야 합니다. 이 명령은 프록시 프로토콜의 연결 상태를 검사하지 않습니다. Windows PowerShell에서는 먼저 TCP 포트를 확인할 수 있으며, OpenSSL이 설치된 환경에서는 핸드셰이크와 인증서 검증 결과도 확인할 수 있습니다.

# PowerShell: 노드 TCP 포트에 연결할 수 있는지 확인
Test-NetConnection -ComputerName node.example.net -Port 443

# OpenSSL: 노드 주소에 연결하고 지정된 서버 이름을 전송해 검증
openssl s_client -connect node.example.net:443 -servername edge.example.net -verify_hostname edge.example.net -verify_return_error -showcerts

TcpTestSucceeded: True는 TCP 연결이 성공했다는 뜻일 뿐, 인증서가 신뢰할 수 있거나 프록시 인증 및 라우팅이 정상이라는 뜻은 아닙니다. OpenSSL의 -servername은 SNI를 전송하고 -verify_hostname은 검증할 이름을 지정합니다. 두 옵션의 역할은 다르므로 앞의 옵션만 추가해서는 이름 검증을 완전히 대신할 수 없습니다.

  1. TCP 연결에 실패하면 주소, 포트, 서버 수신 상태, 방화벽부터 확인하세요. 인증서 이름을 계속 바꿔도 해결되지 않습니다.
  2. TCP 연결은 성공했지만 TLS가 아닌 데이터가 반환되면 포트 매핑과 리버스 프록시 진입점이 올바른지 확인하세요.
  3. TLS에서 이름 또는 신뢰 체인 오류가 발생하면 인증서 SAN, 완전한 체인, 기기의 인증서 저장소를 확인하세요.
  4. TLS 검증은 통과했는데 클라이언트 연결이 계속 실패하면 프록시 프로토콜, 인증 매개변수, WebSocket 경로 등 다른 전송 설정을 확인하세요.

7. 수정 후 재검사 및 자주 묻는 질문

재검사할 때는 같은 노드, 같은 네트워크, 같은 대상 페이지를 유지하고 자동 전환을 끈 다음 연결을 다시 시작하세요. 새 로그에 기존 인증서 오류가 더 이상 나타나지 않는지 확인한 뒤 평소의 라우팅 설정을 복구합니다. 서비스 제공자의 도움이 필요하면 오류 발생 시각, 오류 키워드, 사용한 코어, 완료한 점검 항목을 전달하세요. 구독 링크 전체를 보내지 마세요.

시간을 동기화했는데도 인증서 만료 오류가 계속 표시되나요?

먼저 시스템 시간 동기화가 실제로 성공했는지 확인하고 로그에서 인증서 만료일을 살펴보세요. 인증서가 만료되었다면 서버 측에서 갱신한 뒤 다시 적용해야 합니다. 다른 가상 호스트의 오래된 인증서를 받은 것은 아닌지 SNI도 확인하세요.

인증서 검증을 건너뛰면 연결되는데 계속 켜 둬도 되나요?

장기 설정으로 사용하면 안 됩니다. 먼저 검증을 다시 켜고 유효 기간, 인증서 SAN, 전체 체인을 각각 확인하세요. 검증을 건너뛴 뒤 연결이 되더라도 검사를 우회했다는 뜻일 뿐, 예상한 서버에 연결되었다는 증거는 아닙니다.

지연 시간 측정 결과는 있는데 웹페이지가 열리지 않는 이유는 무엇인가요?

테스트마다 TCP만 확인하거나 서로 다른 요청 경로를 사용할 수 있습니다. 실제 웹페이지 요청에 해당하는 코어 로그를 확인하세요. TLS 검증이 통과했다면 시스템 프록시, 분할 라우팅 규칙, DNS를 점검하고 사이트의 문제 해결 가이드도 참고하세요.

구독을 업데이트한 뒤 수정한 SNI가 다시 원래대로 돌아가나요?

업데이트 전후의 노드 항목을 비교해 구독 소스에서 잘못된 값이 계속 전달되는지 확인하세요. 노드를 복사해 임시로 비교하고 원래 설정은 보관한 뒤 서비스 제공자에게 구독 소스 수정을 요청하세요. 매번 업데이트 후 직접 고치는 일을 피할 수 있습니다.

다른 클라이언트에서는 정상인데 기존 클라이언트를 다시 설치해야 하나요?

먼저 두 클라이언트의 노드 항목, 코어 버전, 시스템 시간, 인증서 저장소를 비교하세요. 이름이 같은 노드라도 설정이 같다는 보장은 없습니다. 차이를 파악한 다음 클라이언트를 업데이트하는 편이 바로 재설치하는 것보다 원인을 찾기 쉽습니다.

최종 점검 순서는 연결 지점, 시스템 시간, SNI와 인증서의 일치 여부, 인증서 체인의 신뢰성, 프록시 매개변수입니다. DNS, 포트, 도메인, 보안 옵션을 한꺼번에 바꾸기보다 이 순서대로 결과를 기록하면 원인을 더 쉽게 찾을 수 있습니다. 항목의 의미는 용어집에서 확인하고, 노드를 처음 가져온다면 클라이언트 설정 가이드를 참고하세요.

v2rayN 다운로드 · 플랫폼 선택