V2Ray TLS 핸드셰이크 실패와 인증서 오류: 시스템 시간, SNI, allowInsecure 완벽 가이드

TLS 인증서 오류는 V2Ray 연결 실패의 가장 흔한 원인입니다. 시스템 시간, SNI 일치, 인증서 체인 완성도, allowInsecure 순서로 점검하면 v2rayN과 v2rayNG에서 원인을 하나씩 찾을 수 있습니다.

요약

'인증서 만료', '인증서 이름 불일치', 'unknown authority' 등 TLS 오류를 겪는 사용자를 위해 시스템 시간, SNI와 도메인 일치, 인증서 체인 완성도, allowInsecure 순서로 점검 방법을 안내하며 각 항목의 v2rayN·v2rayNG 설정 위치를 구체적으로 설명합니다.

TLS 핸드셰이크 실패의 흔한 오류와 점검 순서

TLS 핸드셰이크는 V2Ray 연결의 첫 단계입니다. 클라이언트가 서버로 ClientHello를 보내면 서버는 인증서 체인을 반환하고, 로컬 코어가 인증서 유효 기간·도메인 일치·발급 체인을 순서대로 검증합니다. 어느 하나라도 실패하면 연결은 핸드셰이크 단계에서 끊기며 '연결됐지만 즉시 끊김' 현상이나 코어 로그의 인증서 오류로 나타납니다. v2rayN과 v2rayNG는 동일한 Xray 코어를 사용하므로 오류 형식도 같습니다.

점검 순서는 고정하는 것이 좋습니다. 먼저 오류 메시지를 읽고, 다음으로 시스템 시간을 확인하고, 그다음 도메인과 SNI를 대조한 뒤, 마지막으로 인증서 체인을 검사합니다. 순서를 뒤섞으면 노드만 계속 바꾸게 되고 실제 문제는 그대로 남는 경우가 가장 많습니다.

오류: tls: failed to verify certificate: x509: certificate has expired or is not yet valid

원인과 해결:기기 시스템 시간과 실제 시간의 차이가 커서 인증서 유효 기간을 벗어난 경우입니다. 시스템 자동 시간 동기화를 켜고 코어를 재시작한 뒤 다시 시도하세요.

오류: tls: failed to verify certificate: x509: certificate is valid for v2.example.com, not 203.0.113.10

원인과 해결:서버 주소에 IP를 입력했는데 인증서는 도메인에만 발급된 경우입니다. 주소를 도메인으로 되돌리거나 SNI 필드에 인증서 도메인을 입력하세요.

오류: tls: failed to verify certificate: x509: certificate signed by unknown authority

원인과 해결:서버가 중간 인증서를 내려주지 않아 로컬에서 신뢰 체인을 구성하지 못한 경우입니다. 서버 측에서 전체 인증서 체인 파일을 사용하고, 클라이언트에서는 allowInsecure를 임시로 켜서 원인인지 확인할 수 있습니다.

세 가지 오류는 각각 독립적인 점검 항목에 대응합니다. 이후 장에서는 이 순서대로 설명하며, 각 절 마지막에 v2rayN과 v2rayNG의 구체적인 설정 경로를 제시합니다.

시스템 시간 오차: expired와 not yet valid의 첫 번째 원인

인증서 검증은 기기 로컬 시간을 기준으로 합니다. 인증서에는 NotBefore와 NotAfter 두 시간 경계가 포함되어 있으며, 로컬 시간이 이 경계를 벗어나면 '만료됨' 또는 '아직 유효하지 않음' 오류가 발생합니다. v2rayN의 코어 로그 패널에는 매 핸드셰이크의 로컬 타임스탬프가 출력되므로, 로그 시간과 실제 시간을 먼저 비교해 보고 몇 분 이상 차이가 나면 시간 문제로 판단하면 됩니다.

90일
일반적인 무료 인증서 유효 기간
443
TLS 기본 포트
2곳
시간을 확인해야 할 기기

시간 동기화는 두 단계면 충분합니다. 자동 시간을 켠 뒤 '지금 동기화'를 한 번 눌러주세요. 가상 머신이나 듀얼 부팅 사용자는 게스트 OS 시간이 재개 후 갱신됐는지 추가로 확인해야 합니다. 일시 중단 상태에서는 시간이 멈춰 있기 때문입니다.

Windows와 Android의 시간 동기화 경로

동기화가 끝나면 코어를 재시작한 뒤 다시 시도하세요. v2rayN은 '코어' → '코어 재시작'으로, v2rayNG는 연결 스위치를 껐다 켜면 됩니다. 오류가 사라졌다면 원인은 시간 오차였던 것입니다.

SNI와 도메인 일치: 인증서 이름 불일치 오류 찾기

도메인 일치는 인증서 검증의 두 번째 단계입니다. 클라이언트는 '서버 주소' 또는 별도의 SNI 필드로 인증서의 CN과 SAN 목록을 비교합니다. 주소에 IP를 입력했는데 인증서가 도메인에만 발급된 경우 로그에 valid for xxx, not yyy 오류가 나타납니다. Xray 코어에서 이 필드는 serverName이며, GUI에서는 SNI로 표시됩니다.

{
  "streamSettings": {
    "network": "tcp",
    "security": "tls",
    "tlsSettings": {
      "allowInsecure": false,
      "serverName": "v2.example.com"
    }
  }
}
서버 주소SNI 필드핸드셰이크 결과
v2.example.com비워 둠정상, SNI가 주소의 도메인을 자동으로 사용
203.0.113.10v2.example.com정상, 연결은 IP로 가고 인증서는 SNI 기준으로 검증
203.0.113.10비워 둠인증서 이름 불일치, 핸드셰이크 중단

해결 방법은 두 가지뿐입니다. 주소를 도메인으로 되돌리거나, IP 주소를 유지한 채 SNI 필드에 인증서 도메인을 입력하는 것입니다. 전자는 도메인 해석이 가능한 경우에, 후자는 도메인이 오염되어 IP 직결이 필요한 경우에 적합합니다. v2rayN에서 SNI는 서버 편집 창의 TLS 그룹에 있고, v2rayNG는 서버 편집 페이지의 TLS 관련 설정에서 입력합니다.

인증서 체인 누락과 allowInsecure의 올바른 사용법

인증서 체인은 리프 인증서, 중간 인증서, 루트 인증서로 구성됩니다. 서버는 리프와 중간 인증서를 내려줘야 하며, 루트 인증서는 클라이언트 시스템 신뢰 저장소에서 제공됩니다. 중간 인증서가 없으면 클라이언트가 신뢰 체인을 구성하지 못해 unknown authority 오류가 발생합니다. 이는 서버 설정 문제로, 배포 파일에 리프 인증서만 넣은 경우에 흔합니다.

클라이언트가 핸드셰이크 시작서버가 인증서 체인 전송로컬 루트 인증서 검증TLS 세션 수립

allowInsecure는 인증서 검증 체인 전체를 건너뛰는 역할을 합니다. 유효 기간, 도메인, 발급자 검증을 모두 생략하며 인증서 자체의 문제를 고치지 않고 핸드셰이크만 통과시킵니다. 임시로 켠 뒤 연결이 성공하면 문제가 실제로 인증서 쪽에 있다는 뜻이므로, 이후에는 서버 측에서 인증서를 수리해야지 이 옵션을 계속 켜 두면 안 됩니다.

v2rayN에서 allowInsecure는 서버 편집 창의 TLS 그룹에 있으며, 체크 후 코어를 재시작해야 적용됩니다. v2rayNG는 서버 편집 페이지의 allowInsecure 스위치로, 전환 후 연결을 끊었다 다시 연결해야 합니다. 데이터는 여전히 TLS로 암호화되지만 인증서 신원은 더 이상 검증되지 않으므로 중간자(MITM)가 인증서를 교체할 수 있습니다.

v2rayN과 v2rayNG의 TLS 설정 비교

아래 표는 두 클라이언트에서 네 가지 점검 항목의 설정 위치를 정리한 것입니다. 이 순서대로 진행하면 대부분의 인증서 오류를 해결할 수 있습니다.

점검 항목v2rayNv2rayNG
코어 로그메인 화면 하단 로그 패널메인 화면 로그 진입점
서버 주소서버 편집 → 주소서버 편집 → 주소
SNI서버 편집 → TLS → SNI서버 편집 → TLS 그룹 → SNI
allowInsecure서버 편집 → TLS → allowInsecure서버 편집 → allowInsecure 스위치
연결 재시작코어 → 코어 재시작연결 스위치 끄고 켜기

certificate has expired 오류가 나는데 휴대폰 시간은 맞아요

먼저 v2rayN 로그 패널에 출력된 핸드셰이크 타임스탬프를 확인해 코어가 읽는 로컬 시간을 확인하세요. 그다음 Windows Time 서비스가 실행 중인지 확인하고, 관리자 명령 프롬프트에서 w32tm /resync로 강제 동기화하세요.

도메인을 입력했는데도 not valid for 오류가 나요

도메인이 인증서 SAN과 완전히 일치하는지 확인하세요. www 접두사도 불일치로 간주됩니다. 브라우저에서 https://해당 도메인으로 직접 접속해 인증서 세부 정보의 '주체 대체 이름' 목록을 하나씩 비교해 보세요.

allowInsecure를 켜니 바로 연결되는데 계속 써도 되나요

권장하지 않습니다. allowInsecure는 검증만 건너뛸 뿐 인증서를 고치지 않습니다. 장기적으로 사용하려면 서버 인증서 체인을 완성한 뒤 allowInsecure를 다시 꺼야 합니다.

인증서 오류가 특정 노드에서만 나요

해당 노드의 인증서 설정 문제입니다. 다른 노드로 바꾸면 일시적으로 복구되며, 해당 노드 주소에 IP를 잘못 입력했는데 인증서는 도메인에만 발급된 것은 아닌지도 함께 확인하세요.

코어를 재시작했는데도 같은 오류가 나요

서버 목록에서 수정한 노드가 선택되어 있는지 확인하고, v2rayNG는 구독을 다시 불러온 뒤 시도하세요. 일부 기종은 시스템 시간을 먼저 동기화한 다음 연결을 끊었다 다시 연결해야 합니다.

v2rayN 다운로드