V2Ray TLS 인증서 오류 해결 체크리스트: 시스템 시간 불일치와 SNI 설정 오류 점검

TLS 핸드셰이크 실패는 대부분 노드 문제가 아닙니다. 먼저 시스템 시간 오차를 확인하고, SNI와 serverName이 인증서와 일치하는지 점검한 뒤 allowInsecure와 포트 설정을 확인하세요.

V2Ray, Xray 또는 V2Fly 코어가 TLS 연결을 수립할 때는 먼저 원격 인증서를 검증한 다음 VMess, VLESS 등의 프로토콜 데이터 교환 단계로 넘어갑니다. 인증서 유효 기간, 도메인 일치 여부, 인증서 체인 또는 핸드셰이크 매개변수 중 하나라도 조건을 충족하지 못하면 프로토콜 인증 전에 연결이 중단됩니다. 따라서 로그에 인증서 오류가 표시될 때는 먼저 사용자 ID, 암호화 방식 또는 라우팅 규칙을 바꾸지 않는 것이 좋습니다. 이러한 항목은 현재 연결에 아직 참여하지 않았을 가능성이 큽니다.

인증서 문제를 해결하려면 세 가지 대상을 구분해야 합니다. 실제로 연결하는 서버 주소, TLS 핸드셰이크에 전달되는 서버 이름, 인증서에 명시된 유효 도메인입니다. 노드가 진입 주소, 역방향 프록시 또는 콘텐츠 전송 구조를 사용하는 경우 세 값이 같을 수도 있고 다를 수도 있습니다. 판단 기준은 서로 비슷해 보이는지가 아니라, 설정 제공자가 안내한 필드가 인증서와 정확히 대응하는지입니다.

1. 오류가 실제로 TLS 단계에서 발생했는지 확인

먼저 클라이언트 로그를 열고 한 번 연결을 시도하세요. v2rayN은 로그 영역에서 코어 출력을 확인할 수 있으며, v2rayNG와 v2flyNG는 연결 후 해당 실행 로그를 확인할 수 있습니다. 이번 테스트에서 생성된 기록만 남겨 몇 시간 전 오류를 현재 결과로 착각하지 않도록 하세요.

일반적인 메시지에는 certificate, x509, handshake, unknown authority, expired, not yet valid, hostname 또는 server name 같은 키워드가 포함될 수 있습니다. 코어 버전에 따라 문구는 다르지만 의미별로 분류할 수 있습니다.

로그 의미 우선 확인할 항목 일반적인 원인
인증서가 아직 유효하지 않음 로컬 날짜, 시간 및 시간대 시스템 시계가 느리거나 시간대 설정이 잘못됨
인증서가 만료됨 로컬 시간과 원격 인증서 상태 시스템 시계가 빠르거나 서버 인증서가 갱신되지 않음
도메인이 일치하지 않음 SNI, serverName, 주소 필드 핸드셰이크 도메인이 없거나 주소 필드의 IP를 잘못 입력함
알 수 없는 발급 기관 시스템 인증서 저장소, 네트워크 가로채기, 인증서 체인 루트 인증서가 너무 오래되었거나 원격 서버가 전체 중간 인증서를 보내지 않음
핸드셰이크가 종료되거나 재설정됨 포트, TLS 스위치, 전송 유형 TLS가 아닌 포트에 연결했거나 노드 매개변수 조합이 잘못됨

로그에 시간 초과, 도메인 확인 실패 또는 연결 거부만 표시된다면 먼저 네트워크 연결 가능 여부, DNS와 포트 수신 상태를 확인하세요. 이러한 현상은 인증서 검증 전에 발생합니다. 로그에 인증서 날짜 또는 이름 불일치가 명확히 표시된 경우에만 아래 순서대로 처리하세요.

2. 시스템 시간, 시간대 및 자동 동기화 상태 확인

TLS 인증서에는 유효 시작 시간과 만료 시간이 포함됩니다. 클라이언트는 로컬 시계를 사용해 인증서가 유효 구간에 있는지 판단합니다. 시간이 몇 분만 차이 나도 일반 웹페이지는 열릴 수 있지만, 방금 발급되었거나 갱신된 인증서는 아직 유효하지 않은 것으로 판단될 수 있습니다. 절전 모드 복귀, 메인보드 시계 이상, 가상 환경 일시 중지, 장기간 자동 동기화 중단 등이 시간 오차를 일으킬 수 있습니다.

  1. 시스템에 표시된 연도, 월, 일과 분을 확인하고 명백한 오류부터 배제하세요.
  2. 시간대가 현재 위치와 일치하는지 확인하세요. 표시되는 시간이 맞더라도 시간대가 잘못되면 실제 시간이 어긋날 수 있습니다.
  3. 시스템의 자동 시간 설정과 자동 시간대 설정을 켠 뒤 즉시 동기화를 한 번 실행하세요.
  4. 클라이언트를 완전히 종료한 후 다시 시작해 새 시간 상태에서 코어가 연결을 수립하도록 하세요.
  5. 로그를 다시 확인해 “아직 유효하지 않음” 또는 “만료됨”이라는 안내가 사라졌는지 확인하세요.

Windows에서는 날짜 및 시간 설정에서 자동 동기화 상태를 확인할 수 있습니다. macOS에서는 날짜 및 시간 설정에서 시간 출처를 확인하세요. Android에서는 자동 날짜 및 시간과 자동 시간대를 모두 확인해야 합니다. Linux 데스크톱 환경은 일반적으로 시스템 설정에서 동기화를 완료할 수 있으며, 추가 확인이 필요하면 터미널에서 시스템 시간 동기화 상태를 확인하세요.

timedatectl status

로컬 시간, UTC 시간, 시간대와 시스템 시계의 동기화 여부를 중점적으로 확인하세요. 클라이언트 화면의 설정만 바로잡는 것으로는 시스템 시간 보정을 대신할 수 없습니다. 인증서 검증은 코어와 시스템 시간이 함께 결정하기 때문입니다.

3. SNI, serverName 및 서버 주소를 항목별로 확인

SNI는 TLS 핸드셰이크에 전달되는 서버 이름입니다. 하나의 진입 주소에 여러 도메인이 연결될 수 있으며, 서버는 SNI를 바탕으로 반환할 인증서를 선택합니다. V2Ray와 Xray 설정에서 자주 보이는 serverName은 일반적으로 이 핸드셰이크 이름을 지정하는 데 사용됩니다. 일부 클라이언트 화면에서는 SNI, 서버 이름 또는 TLS Server Name으로 표시됩니다.

서버 주소는 TCP, WebSocket, gRPC 또는 기타 하위 계층 연결을 수립하고, serverName은 TLS 이름을 검증합니다. 두 항목의 용도는 다릅니다. 노드 주소는 도메인일 수도 있고 IP일 수도 있지만 serverName에는 일반적으로 인증서가 포함하는 도메인을 입력해야 합니다. 연결 주소가 IP라는 이유만으로 IP를 SNI 필드에 그대로 복사하면 안 됩니다.

다음 네 가지 항목을 대조하세요

  1. 주소 필드: 불필요한 공백, 프로토콜 접두사, 경로 또는 포트가 없는지 확인하세요. 주소 필드에는 일반적으로 도메인 또는 IP만 입력합니다.
  2. 포트 필드: 노드 정보의 값과 일치하는지 확인하고, 흔히 쓰이는 포트라는 이유로 임의로 바꾸지 마세요.
  3. TLS 스위치: 안내된 설정에서 TLS를 사용한다면 반드시 켜고, TLS를 사용하지 않는다면 추가로 켜지 마세요.
  4. serverName 필드: 노드 정보에 안내된 인증서 도메인을 그대로 입력하고 주소 필드의 값으로 임의 변경하지 마세요.

도메인 일치는 인증서 규칙을 따릅니다. 인증서가 node.example.com을 포함한다고 해서 example.com 또는 api.node.example.com까지 반드시 포함하는 것은 아닙니다. 와일드카드 인증서도 정해진 계층만 포함합니다. 여러 도메인이 결국 같은 IP로 확인되더라도 인증서 이름 검증은 도메인을 기준으로 수행됩니다.

구독으로 가져온 뒤에는 필드를 직접 “간소화”하지 마세요. 구독은 주소, host, path, SNI와 전송 유형을 각각 제공할 수 있습니다. 이를 하나의 도메인으로 합치면 기존 조합이 깨지기 쉽습니다. 구독 내용이 오래되었다고 의심되면 먼저 구독을 업데이트하고, 중복된 기존 노드를 삭제한 다음 새로 가져온 노드로 한 번 테스트하세요.

WebSocket에서 Host와 SNI를 혼동하지 않기

WebSocket 설정의 Host는 HTTP 요청 헤더이고 SNI는 TLS 핸드셰이크에 사용됩니다. 두 값이 같은 경우도 있지만 동일한 매개변수는 아닙니다. gRPC 서비스 이름 역시 serverName이 아닙니다. 점검할 때는 각 필드를 하나씩 대조하고 경로, Host 또는 서비스 이름을 SNI에 입력하지 마세요.

일반적인 논리 관계는 다음과 같습니다.

연결 주소: 진입 도메인 또는 진입 IP
연결 포트: 노드에서 지정한 TLS 포트
TLS: 사용
serverName / SNI: 인증서가 포함하는 도메인
WebSocket Host: 노드에서 지정한 HTTP Host
WebSocket Path: 노드에서 지정한 요청 경로

serverName을 변경한 뒤 로그가 “인증서 도메인 불일치”에서 “WebSocket 비정상 상태 코드 반환” 또는 “서비스 이름 없음”으로 바뀌었다면 TLS 단계는 통과했을 가능성이 있으며 문제가 전송 계층으로 넘어간 것입니다. 이때는 인증서 옵션을 계속 반복해서 조정하지 말고 Host, 경로 또는 gRPC 서비스 이름을 확인하세요.

4. 포트, TLS 스위치와 전송 매개변수가 하나의 설정인지 확인

인증서 오류가 반드시 인증서 자체 때문에 발생하는 것은 아닙니다. TLS가 아닌 서비스에 TLS 핸드셰이크를 보내거나 TLS 진입점에 일반 연결을 보내도 핸드셰이크 실패, 연결 재설정 또는 예상치 못한 응답이 발생할 수 있습니다. 가장 흔한 원인은 노드를 수동 편집하면서 포트만 바꾸고 TLS와 전송 유형을 함께 수정하지 않는 것입니다.

  • 노드를 복사할 때 VMess 또는 VLESS 프로토콜 유형이 잘못 변경되지 않았는지 확인하세요.
  • TCP, WebSocket 또는 gRPC 등 전송 유형이 안내된 설정과 일치하는지 확인하세요.
  • TLS 관련 스위치와 포트가 동일한 노드 매개변수 세트에 속하는지 확인하세요.
  • WebSocket 경로를 올바른 형식으로 입력하고 도메인 필드에 잘못 복사하지 않았는지 확인하세요.
  • gRPC 서비스 이름의 원래 대소문자와 문자 내용을 유지했는지 확인하세요.
  • 로컬 수신 포트를 원격 서버 포트에 입력하지 않았는지 확인하세요.

라우팅은 일반적으로 인증서의 도메인 일치 결과를 바꾸지 않지만 연결이 다른 출구를 거치게 할 수 있습니다. 문제를 확인하는 동안에는 먼저 대상 노드 자체가 연결을 수립할 수 있는지 확인한 뒤 복잡한 규칙을 다시 적용하세요. 특정 라우팅 규칙이 적용될 때만 실패한다면 인증서 검증을 바로 끄지 말고 해당 규칙이 선택한 아웃바운드가 여전히 예상 노드를 가리키는지 확인하세요.

마찬가지로 시스템 프록시 상태는 애플리케이션 트래픽이 클라이언트로 들어오는지를 주로 결정하며 노드 인증서의 유효성은 결정하지 않습니다. 로그에 코어가 원격 서버에 연결 중이라고 표시된다면 테스트 요청은 이미 클라이언트에 도달한 것입니다. 이때 시스템 프록시 모드를 계속 바꿔도 인증서 만료나 SNI 오류가 직접 해결되지는 않습니다.

5. allowInsecure의 용도를 올바르게 이해하기

allowInsecure는 원격 인증서 검증을 완화할지 제어하는 설정입니다. 정상적으로 사용할 때는 꺼 두어야 합니다. 켜면 인증서 이름, 발급 체인 또는 유효성 검사를 우회할 수 있어 일부 오류가 잠시 사라질 수 있지만, 원래 설정이 올바르다는 뜻도 아니고 서버 인증서가 수정되는 것도 아닙니다.

점검할 때는 이를 범위가 제한된 진단 스위치로만 사용하세요. 꺼져 있을 때 명확한 인증서 검증 오류가 발생하고, 임시로 켠 후 다음 단계로 진행된다면 문제는 인증서 검증 경로에 집중되어 있다는 뜻입니다. 위치를 파악한 뒤에는 즉시 다시 끄고 시스템 시간, serverName, 인증서 체인 또는 서버 설정을 수정하세요.

allowInsecure를 장기간 “연결만 되면 된다”는 해결책으로 사용하는 것은 권장하지 않습니다. TLS 이름 및 발급 검증은 예상한 서비스에 연결되었는지 확인하는 데 사용됩니다. 검증을 건너뛰면 클라이언트가 정상적인 규칙에 따라 원격 신원을 확인할 수 없습니다. 특히 공용 네트워크나 트래픽 전달이 존재하는 환경에서는 전체 검증을 유지해야 합니다.

6. 인증서 체인, 시스템 인증서 저장소 및 네트워크 가로채기 확인

로그에 알 수 없는 발급 기관 또는 신뢰 체인을 만들 수 없다는 메시지가 표시되면 먼저 운영체제를 업데이트한 뒤 기기를 다시 시작하세요. 시스템 루트 인증서 저장소를 오랫동안 업데이트하지 않으면 최신 발급 체인을 인식하지 못할 수 있습니다. 클라이언트와 코어도 현재 유지 관리 버전을 사용해야 합니다. 오래된 버전에는 구식 TLS 구성 요소나 인증서 처리 로직이 포함될 수 있습니다.

같은 노드가 모바일 네트워크에서는 작동하지만 회사, 학교 또는 공용 네트워크에서 인증서 오류를 보고한다면 두 네트워크의 로그에 표시된 인증서 이름과 발급 정보를 비교하세요. 일부 네트워크는 인증 게이트웨이를 통해 자체 로그인 페이지를 반환할 수 있으며, 이 경우 클라이언트가 받은 것은 대상 서버의 인증서가 아닙니다. 먼저 네트워크 인증을 완료하거나 네트워크 관리자에게 접속 정책을 확인하세요.

모든 기기와 모든 네트워크에서 동일한 노드에 대해 인증서 체인 불완전 오류가 발생하고 다른 노드는 정상이라면 서버 측 문제일 수 있습니다. 서버에서 TLS를 설정할 때는 사이트 인증서뿐 아니라 필요한 중간 인증서 체인도 전송해야 합니다. 클라이언트는 사이트 인증서만으로 누락된 모든 단계를 자동으로 보완할 수 없습니다. 일반 사용자는 전체 로그를 보관해 노드 운영자에게 전달하고, 클라이언트를 반복해서 재설치하는 방식으로 서버 문제를 감추지 마세요.

7. 비교 테스트로 문제 범위 좁히기

비교 테스트가 계속해서 시행착오를 반복하는 것보다 효과적입니다. 이전에 정상적으로 작동한 노드 하나를 기준으로 준비한 뒤 기기, 네트워크와 노드 세 가지 차원에서 테스트하세요. 매번 변수 하나만 바꾸세요.

테스트 결과 우선 판단할 항목 다음 단계
같은 기기에서 노드 하나만 실패 노드 매개변수 또는 원격 인증서 SNI, 포트, 전송 및 인증서 상태 확인
같은 노드가 한 기기에서만 실패 기기 시간, 인증서 저장소 또는 클라이언트 설정 시간 동기화, 시스템 업데이트, 구독 다시 가져오기
같은 노드가 한 네트워크에서만 실패 네트워크 인증, DNS 또는 중간 장비 인증을 완료하고 다른 네트워크의 로그와 비교
모든 TLS 노드가 동시에 실패 시스템 시간, 시스템 인증서 저장소 또는 네트워크 환경 먼저 시간을 보정한 뒤 다른 네트워크에서 테스트
TLS 통과 후 프로토콜 인증 실패 발생 사용자 매개변수 또는 프로토콜 설정 ID, 프로토콜 유형과 구독 내용 확인

테스트 중에는 구독을 자주 업데이트하거나 노드를 일괄 수정하지 마세요. 구독 업데이트가 수동 설정을 덮어쓰거나 같은 이름의 노드를 만들어 테스트 대상이 바뀔 수 있습니다. 노드 업데이트 시각, 클라이언트 이름, 코어 유형, 네트워크 환경과 전체 오류 발생 시각을 기록할 수 있습니다. 문제를 전달할 때 이러한 정보가 단순히 “연결되지 않음”이라는 설명보다 원인을 찾는 데 훨씬 유용합니다.

8. 최종 점검 체크리스트

  1. 시스템 날짜, 시간과 시간대가 모두 정확하고 자동 동기화가 완료되었습니다.
  2. 클라이언트 로그에 이번 연결에서 발생한 오류가 표시됩니다.
  3. 서버 주소에는 올바른 도메인 또는 IP만 포함되어 있으며 경로가 섞여 있지 않습니다.
  4. 원격 포트가 노드 정보와 일치하고 로컬 프록시 포트를 잘못 입력하지 않았습니다.
  5. TLS 스위치, 전송 유형과 포트가 동일한 설정에서 가져온 값입니다.
  6. serverName 또는 SNI가 인증서에 포함된 도메인과 일치합니다.
  7. WebSocket Host, 경로 또는 gRPC 서비스 이름을 잘못된 필드에 입력하지 않았습니다.
  8. 구독이 업데이트되었으며 테스트 대상은 남아 있던 같은 이름의 이전 노드가 아닙니다.
  9. allowInsecure가 다시 꺼져 있으며 장기 설정으로 남아 있지 않습니다.
  10. 시스템, 클라이언트와 코어가 현재 유지 관리 버전입니다.
  11. 다른 기기 또는 다른 네트워크에서 비교 테스트를 한 번 완료했습니다.
  12. 단일 노드만 계속 실패한다면 로그를 저장해 운영자에게 전달했습니다.

TLS 점검의 핵심 순서는 시간, 이름, 포트, 전송, 인증서 체인으로 요약할 수 있습니다. 먼저 로컬 시간을 확인하고 serverName이 인증서와 일치하는지 판단한 다음 TLS가 올바른 포트에 연결되는지 확인하고, 마지막으로 인증서 체인과 네트워크 환경을 처리하세요. 이 순서대로 항목을 확인하면 VMess, VLESS, 구독 또는 라우팅 설정을 불필요하게 전부 다시 구성하는 일을 피할 수 있습니다.

v2rayN 다운로드