이 경우, 나는 ATS의 목적을 잘못 해석하고 있다고 생각하지만, 원하는 것을하기위한 조항이 있습니다. ATS는 조건부 유효성을 검사하도록 설계되지 않았으므로 네트워크 연결의 모든 (또는 적어도 지정된 하위 집합)에 대해 OS 별 모범 사례 세트를 시행해야합니다. 대부분의 간단한 응용 프로그램의 경우 눈에 잘 띄는 사이트 나 제어하는 사이트 중 일부에 액세스 할 때 충분합니다. 귀하의 경우에는 잠재적으로 사용자에게 안전하지 않은 사이트에 연결할지 여부 또는 잘못 구성된 사이트에 대해 내부 또는 호스팅 된 허용 목록을 사용할 것인지 묻는 확인 기능이 필요합니다.
다른 조직에서 설정할 수도있는 임의의 서버에 연결할 수있는 앱이 있으므로 업그레이드주기와 보안에 대한 관점이 매우 다를 수 있습니다.이런 종류의 설정에서는 보안이 취약한 사이트 (또는 사람들이 Let 's Encrypt를 더 많이 사용하기 전까지 자체 서명 된 인증서)를 지원할 수있는 유연성이 필요하기 때문에 화이트리스트 형식 (Apple의 기본값)은 적절하지 않습니다.
우리의 목적을 위해 우리는 ATS에 블랙리스트 스타일을 사용합니다. 기본적으로 우리가 통제하는 사이트와 잘 알려진 사이트는 보안 수준이 더 높아질 것이므로 ATS가 해당 사이트를 강제 적용해야합니다. 다른 모든 사이트의 경우 ATS가 비활성화되어 비 SSL 및 잘못 구성된 SSL을 사용할 수 있습니다.
자신 만의 점검을 수행하려면 NSURLSessionDelegate
을 구현하고 URLSession:didReceiveChallenge:completionHandler:
을 사용하여 SSL/TLS 연결의 유효성에 대한 자신의 결정을 내려야합니다.
핸들러 내부에서 적절하다고 생각되는 모든 인증을 수행 할 수 있으며 completionHandler
블록이 있으므로 계속하기 전에 사용자에게 메시지를 표시 할 수도 있습니다.
이 메서드는 인증서의 세부 정보를 표시 한 후 사용자가 선택할 수 있도록 허용하고 인증서 고정 용도로 사용합니다. 피닝의 경우 기본적으로 사이트 인증서의 지문을 저장하고이를 사용하여 사용자가 사이트를 확인했는지 확인합니다 (사이트 이름을 사용하는 것보다 훨씬 안전합니다. 사용자가 권한이나 인증서의 유효성을 검사하고 URL을 검증하므로 훨씬 더 안전합니다).).
완성도를 위해서
, 나는 그런 당신의 자신으로 "블랙리스트 스타일"위에서, 나는 YES
에에 NSAllowsArbitraryLoads
를 사용하여, 특히 당신이 (안전해야 알 도메인을 나열하는 NSExceptionDomains
를 사용하여 구체적으로 말하는 겁니다 참조 서버 또는 잘 알려진 서비스). 여기에는 예외 테이블의 항목에 대해 NSExceptionAllowsInsecureHTTPLoads
~ NO
을 설정해야합니다.
감사합니다. @ 지갑! 파산은 그것이 내가 예상했던 대답이지만, 나는 무엇인가 놓치기를 바라고 있었다. 보호받지 못한 문제는 중간 공격에서 사람을 보호하는 것보다 더 중요합니다. ATS가 꺼져있는 경우에도 SSL을 사용하여 서버를 공격해도 누군가가 해당 서버 인증서를 '가짜'로 만들 수 있으며 내 앱 (ATS 포함)은 '잘못된'연결을 수락합니다. 아무리해도 좋은 생각이 떠오르는 것처럼 보입니다. – lostintranslation