2008-08-18 5 views
8

NSURLRequest을 사용하여 만료 된 인증서가있는 웹 사이트에 액세스하려고합니다. 내가 요청을 보낼 때, 내 연결 : didFailWithError 위임 방법은 다음과 같은 정보를 호출 :Objective-C/Cocoa : 잘못된 서버 인증서를 어떻게 받아들입니까?

-1203, NSURLErrorDomain, bad server certificate 

내 검색 해결책은 단 하나 켜져있다 : NSURLRequest에 숨겨진 클래스 메소드 :

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost]; 

그러나 명백한 이유로 프로덕션 앱에서 비공개 API를 사용하고 싶지 않습니다.

어떻게해야할까요? CFNetwork API를 사용해야하는 경우, 다음 두 가지 질문이 필요합니다.

  • 시작하기 전에 사용할 수있는 샘플 코드는 무엇입니까? 온라인을 찾지 못했습니다.
  • CFNetwork를 사용하면 NSURL을 완전히 버려야합니까?

EDIT :

아이폰 OS 3.0 이렇게하는 지원 방법을 소개했다. 자세한 내용은 여기를 참조하십시오 : How to use NSURLConnection to connect with SSL for an untrusted cert?

답변

1

나는 SOAP 클라이언트를 개발 중이며 dev 서버에 "자체 개발 된"인증서가 있습니다. 나는 NSURL을 사용하지 않았기 때문에 그 방법을 사용해도이 문제를 해결할 수 없었지만 (잘 문서화되어 있지 않고 분명히 버려진) WS 방법을 사용했고, (내부적으로) 비 SSL을 사용하기로 결정했다. 연결.

그러나 생산 용 앱에서 비공개 API를 사용하고 싶지 않다면 dodgy 인증서가있는 사이트에 대한 액세스를 허용해야한다고 생각하십니까?

내가 Jens Alfke을 인용합니다 :

단지 이론적 인 보안 문제가 아니에요

. 공공 DNS 서버의 25 %와 같은 뭔가

최근 보도에 따르면, 손상되었고, 제대로 도메인 이름을 입력하면 피싱/악성 코드/광고 사이트도
을 사용자를 안내 할 수 있습니다. 당신을 보호하는 유일한 방법은 SSL 인증서 확인입니다.

+0

문제의 사이트가 테스트 환경에 만 접근 내부. 나는 네트워크 관리자가 너무 싸거나 너무 게으른 그것을 위해 유효한 인증서를 유지하는 것 같아요. 우리의 프로덕션 환경에는 유효한 인증서가 있습니다. 이 인증서 회피 기능은 프로덕션 환경에서 사용하거나 필요하지 않으므로 테스트 용으로 전용 API를 사용할 수 있습니다. 개인용 API가 yank 된 경우 제 1면에 돌아 왔으므로 여전히 "올바른"방식으로 수행하는 것을 선호합니다. –

1

자체 서명 된 인증서를 만들고 신뢰할 수있는 CA에 사용자 지정 인증 기관을 추가 할 수 있습니까? 나는 이것이 아이폰에서 어떻게 작동할지는 모르지만, 맥 오에스 텐에서 이들을 키 체인에 추가한다고 가정 할 것이다. 또한이 게시물 Re: How to handle bad certificate error in NSURLDownload

3

는 테스트 목적으로 내부 서버의 경우에 관심이있을 수

, 왜 그냥 키 체인로 테스트 서버의 인증서를 가져올 및 사용자 지정 신뢰 설정을?

8

지원되는 방법으로 CFNetwork를 사용해야합니다.kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse를 지정하는 스트림에 kCFStreamPropertySSLSettings를 첨부해야합니다. 다음은 유효한 결과를 확인하지 않고 정리를 추가하는 빠른 코드입니다. 일단이 작업을 완료하면 CFReadStreamRead()를 사용하여 데이터를 가져올 수 있습니다.

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL); 
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1); 
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest); 
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse); 
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);  
CFReadStreamOpen(myStream); 
0

또 다른 옵션은 대체 연결 라이브러리를 사용하는 것입니다.

내가 AsyncSocket의 엄청난 팬이하고 자체 서명 인증서 표시

http://code.google.com/p/cocoaasyncsocket/

보세요

에 대한 지원을하고, 나는 다음 표준 NSURLRequests 방법보다 강력한 생각합니다.

관련 문제