iOS 9에서 App Transport Security가 활성화 된 HTTP URL을 어떻게로드합니까? [복제]
이 질문에는 이미 답변이 있습니다.
- 전송 보안이 일반 텍스트 HTTP 25 답변을 차단했습니다.
따라서 지난 밤에 출시 된 iOS의 새로운 베타 SDK에는 "App Transport Security"가있어 개발자가 http 대신 https를 사용하도록 권장합니다. 원칙적으로 이것은 좋은 아이디어이며 준비 / 생산 환경에서 이미 https를 사용하고 있습니다. 그러나 iOS 앱이 랩톱에서 실행중인 웹 서비스에 연결되어있을 때 로컬 개발 환경에 https가 설정되어 있지 않습니다.
오늘 아침에 약간의 플레이에서 URL 로딩 시스템은 http URL을 전달하더라도 https를 대신 사용하기로 결정한 것으로 보입니다. 누구나 특정 URL에 대해서만이 동작을 비활성화하는 방법을 알고 있습니까?
자세한 내용은 Apple의 Info.plist 참조 를 참조 하십시오 (@ gnasher729 덕분에).
Info.plist에서 특정 도메인에 대한 예외를 추가 할 수 있습니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
제외 된 각 도메인의 모든 키는 선택 사항입니다. 화자는 어떤 키도 정교하게 설명하지 않았지만 모두 합리적으로 명확하다고 생각합니다.
(출처 : WWDC 2015 session 703,“Privacy and Your App” , 30:18)
앱에 적절한 이유가있는 경우 단일 키를 사용하여 모든 앱 전송 보안 제한을 무시할 수도 있습니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
앱에 적절한 이유가없는 경우 거부 할 위험이 있습니다.
NSAllowsArbitraryLoads를 true로 설정하면 작동하지만 애플은 특별한 이유 없이이 플래그를 사용하는 앱을 거부한다는 점에서 매우 분명했습니다. NSAllowsArbitraryLoads를 사용하는 주된 이유는 사용자가 만든 콘텐츠 (링크 공유, 사용자 지정 웹 브라우저 등) 때문입니다. 이 경우에도 Apple은 사용자가 제어하고있는 URL에 대해 ATS를 시행하는 예외를 포함 할 것으로 예상합니다.
TLS 1.2를 통해 제공되지 않는 특정 URL에 액세스해야하는 경우 해당 도메인에 대한 특정 예외를 작성해야하며 NSAllowsArbitraryLoads를 yes로 설정하지 마십시오. NSURLSesssion WWDC 세션에서 자세한 정보를 찾을 수 있습니다.
NSAllowsArbitraryLoads 솔루션을 공유 할 때주의하십시오. Apple의 권장 수정 사항은 아닙니다.
— kcharwood (@ marco-tolman 감사)
허용 된 답변에 필요한 정보가 제공 되었으므로 App Transport Security 사용 및 비활성화 에 대한 자세한 내용은에서 자세한 내용을 참조하십시오 .
도메인 별 예외의 경우이를 Info.plist에 추가하십시오 .
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
그러나 사용해야하는 안전하지 않은 도메인을 모두 모른다면 어떻게해야합니까? Info.plist 에서 다음 키를 사용하십시오.
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
이것을 따라 갔다 .
info.plist에 키를 추가하여 해결했습니다. 내가 따르는 단계는 다음과 같습니다.
내 프로젝트
info.plist
파일을 열었습니다라는 키 추가
NSAppTransportSecurity
A와를Dictionary
.NSAllowsArbitraryLoads
as 이라는 하위 키를 추가하고 다음 이미지와 같이Boolean
값을 설정합니다YES
.
프로젝트를 청소하면 지금처럼 모든 것이 제대로 작동합니다.
참조 링크 .
로컬 개발자 서버에 대해 App Transport Policy를 사용하지 않으려면 다음 솔루션이 효과적입니다. Google App Engine dev 서버를 사용하는 경우 HTTPS를 설정할 수 없거나 실용적이지 않을 때 유용합니다.
다른 사람들이 말했듯이 ATP는 프로덕션 앱에서 반드시 꺼서는 안됩니다.
1) 다른 plist를 디버그에 사용하십시오.
Plist 파일과 NSAllowsArbitraryLoads를 복사하십시오. 이 Plist를 사용하여 디버깅하십시오.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
2) 로컬 서버 제외
또는 단일 plist 파일을 사용하고 특정 서버를 제외 할 수 있습니다. 그러나 IP 4 주소를 제외 할 수있는 것처럼 보이지 않으므로 대신 서버 이름을 사용해야합니다 (시스템 환경 설정-> 공유에 있거나 로컬 DNS에 구성되어 있음).
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>server.local</key>
<dict/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
plist 파일로 해결했습니다.
- NSAppTransportSecurity : Dictionary를 추가하십시오.
- "NSAllowsArbitraryLoads"라는 하위 키를 부울로 추가 : YES
위의 구성이 작동하지 않았습니다. 나는 많은 키 조합을 시도했지만 이것은 잘 작동합니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>mydomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
@adurdin 및 @User가 제공 한 답변 컴파일
info.plist에 다음을 추가하고 localhost.com
해당 도메인 이름으로 변경 하면 여러 도메인을 추가 할 수도 있습니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
</dict>
</dict>
</plist>
info.plist는 다음과 같아야합니다.
나를 위해 일한 것은 다음과 같습니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
<key>NSExceptionDomains</key>
<dict>
<key><!-- your_remote_server.com / localhost --></key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
<!-- add more domain here -->
</dict>
</dict>
다른 사람들을 돕고 시간을 절약하기 위해 이것을 추가하고 싶습니다.
사용중인 경우 : CFStreamCreatePairWithSocketToHost
. 당신 host
이 가진 것과 동일 .plist
하거나 소켓에 대한 별도의 도메인이 있다면 거기에 추가하십시오.
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);
이것이 도움이 되길 바랍니다. 건배. :)
'development' 카테고리의 다른 글
MySQL 데이터베이스에서 단일 테이블의 백업을 수행하는 방법은 무엇입니까? (0) | 2020.02.20 |
---|---|
pkg_resources라는 모듈이 없습니다. (0) | 2020.02.20 |
최대 절전 모드는 동시에 여러 개의 백을 가져올 수 없습니다 (0) | 2020.02.20 |
각각을 사용할 때 목록 대 튜플? (0) | 2020.02.20 |
배열을 반복하는 대신 정의 된 횟수만큼 ng-repeat하는 방법은 무엇입니까? (0) | 2020.02.20 |