API는 같은 iPhone의 Safari에서는 응답하는데 앱의 요청은 시간 초과되며, 이 차이는 대개 터널이 아닙니다. 내부 서비스를 호출하는 앱도 평범한 HTTPS 요청을 보내며, 기기에 이미 있는 VPN은 그 요청에 경로가 있는지만 결정합니다. 앱에 두 번째 터널을 넣는 것은 제품 결정입니다, 시간 초과에 대한 수리가 아닙니다. 다음 내용은 앱이 이미 가진 오류 표면을 사용해 실패가 일어나는 위치로 분류합니다.

터널이 아니라 오류에서 시작하십시오

URLSession 전송 실패를 NSError 값으로 NSURLErrorDomain 안에서 보고하며, 코드는 가장 값싼 증거입니다. 구성을 바꾸기 전에 그 코드를 실패한 호스트 이름과 작업의 경과 시간과 함께 기록하십시오. 시간 초과, 이름 실패, 신뢰 실패는 화면에서 똑같이 보이고 서로 다른 세 가지 수리를 요구합니다. 먼저 분류하고, 그다음 해당 분류의 절을 읽으십시오.

작업 지표는 연결이 아예 성립되었는지라는 다음 질문에 답하며, 이것은 경로가 없던 요청과 서버가 너무 늦게 응답한 요청을 구분합니다. 이 중 어느 것도 터널을 바꿀 필요가 없으며, 필요한 것은 요청 자체의 진단을 읽을 수 있는 곳에 출력하는 것입니다.

이름 확인은 다른 무엇보다 먼저 실패합니다

예를 들어 api.corp.example 같은 짧은 사무실 이름은 보통 휴대폰에 없는 검색 도메인에 의존하므로, 앱은 건물 안에만 존재하는 이름을 확인합니다. NSURLErrorCannotFindHost 이것이 그 징후입니다. 전체 호스트 이름은 VPN이 설치하는 어떤 리졸버로든 확인되어야 하며, 검색 도메인이 보장되지 않을 때는 앱이 완전한 정규화 형식을 요청해야 합니다. 이름을 주소로 바꾸고 인증서 검사를 끄는 것은 실패를 고치는 대신 옮기는 것입니다.

사설 DNS 레코드와 정확히 그 이름으로 발급된 인증서가 지원되는 조합입니다. 나머지는 모두 사용자에게 배포되는 우회책입니다.

시간 초과는 이름의 문제가 아니라 경로의 문제입니다

NSURLErrorTimedOut 이름이 확인되었고 아무것도 응답하지 않았다는 뜻이며, 이는 경로, 패킷 정책 또는 서비스를 가리킵니다. 터널이 앱별로 할당될 때 같은 서버에 도달하는 다른 앱은, 그 매핑이 공유되지 않기 때문에 여러분의 빌드에 대해 아무것도 말해 주지 않습니다. 실행 중인 번들이 그 할당 안에 있는지 확인하고, 그다음 해당 서비스 경로가 허용되는지 확인하십시오. 할당 밖에 설치된 개발 빌드는 터널 완전히 밖에 있을 수 있고 고장 난 API처럼 보일 수 있습니다.

브라우저 비교는 기기의 어떤 앱에 경로가 있음을 보여 줍니다. 그것은 여러분의 빌드에 있다는 것을 결코 증명하지 않으므로 두 테스트는 따로 실행해야 합니다.

신뢰 실패는 인증서의 이름에 관한 것입니다

NSURLErrorServerCertificateUntrusted 그 아래의 TLS 오류와 함께라면 체인이나 신원 검사가 실패했다는 뜻입니다. 내부 CA는 기기에서 신뢰되어야 하며, 다른 호스트 이름으로 발급된 인증서는 아무리 네트워크를 다시 구성해도 여전히 잘못입니다. Apple의 App Transport Security 지침 은 이러한 URL 로딩 연결에 계속 적용되며, 일반 HTTP 서비스 주변의 터널이 그 서비스를 종단 간 안전하게 만들지는 않습니다.

신원이나 신뢰 앵커를 고치고 예외 목록은 비워 두십시오. 임의 로딩에 대한 포괄적 예외는 개발 중에 실패를 숨기고 이후 모든 사용자에게 그대로 남깁니다.

HTTP 거부는 네트워크가 아니라 앱의 몫입니다

핸드셰이크가 완료된 뒤의 401 또는 403은 요청이 도착했고 서비스가 거절했다는 뜻이므로, 남은 질문은 계정, 토큰 대상, 범위 또는 키입니다. 상태 코드와 호스트 이름을 기록하고, 베어러 토큰이나 응답 본문은 절대 기록하지 마십시오. 그 시점에 터널은 제 일을 하고 있으며 추가 네트워크 변경은 실제 수리만 늦춥니다.

이 표는 터미널 옆에 두어야 할 분류로, 앱이 실제로 보고할 수 있는 실패마다 한 행입니다. 읽기 전에 코드를 출력하십시오—고른 행이 어느 절을 차례로 볼지 결정합니다.

Where it failsWhat the app seesFirst check
name resolutionNSURLErrorCannotFindHost (-1003)resolve the fully qualified name from the device itself
no path, or no answerNSURLErrorTimedOut (-1001)is this bundle inside the per-app mapping, and is the service path allowed
TLS trustNSURLErrorServerCertificateUntrusted (-1202)does the certificate name match the host, and is the internal CA trusted
service refusalHTTP 401 or 403 after a completed handshakeaccount, token audience, scope or key

각 행은 그 아래 행보다 싸게 시험할 수 있고, 각각은 같은 요청의 다른 계층을 배제합니다. 일치하는 행을 찾을 때까지 표를 내려가고, 그다음 네트워크 변경을 멈추십시오.

관련 글