NSURLC Connection을 사용하여 신뢰할 수 없는 증명서를 SSL로 접속하려면 어떻게 해야 합니까?
SSL 웹 페이지에 연결하기 위한 다음과 같은 간단한 코드가 있습니다.
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
, 된 증명서일 합니다.Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
접속을 받아들이도록 설정하는 방법(브라우저에서 accept를 누를 수 있는 경우와 같음) 또는 우회하는 방법이 있습니까?
API를 사용하세요!이 your your your your your your에 이런 것을 .NSURLConnection
★★★★
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
if ([trustedHosts containsObject:challenge.protectionSpace.host])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
:connection:didReceiveAuthenticationChallenge:
따라 등필요에 따라서, 유저에게 다이얼로그 박스를 제시한 후, 송신자(발신자)가 나중에 표시됩니다.
프라이빗 API를 사용할 마음이 없는 경우(또는 사용할 수 없는 경우), 하위 레벨에 대한 래퍼를 제공하는 ASIHTTPRequest라는 오픈소스(BSD 라이선스) 라이브러리가 있습니다.CFNetwork APIs
에 '아예'를 허용하는 HTTPS connections
또는 할 수 없는 -setValidatesSecureCertificate:
API. 라이브러리 전체를 가져오지 않으려면 소스를 동일한 기능을 구현하기 위한 참조로 사용할 수 있습니다.
iOS 어플리케이션이 신뢰할 수 없는 증명서를 받아들일 필요가 있는 경우는, 2개의 시나리오만 있는 것이 이상적입니다.
시나리오 A: 자기 서명 증명서를 사용하고 있는 테스트 환경에 접속되어 있다.
B: 있다B: 프록시 하고 있다HTTPS
를 MITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
는 자기 가 "CA"를 할 수 .HTTPS
★★★★★★ 。
프로덕션 호스트는 명백한 이유로 신뢰할 수 없는 인증서를 사용하지 않아야 합니다.
가 테스트 할 수 없는 가 있는 , 하여 iOS에서 로 하는 합니다.NSURLConnection
API. 이 논리를 제거하지 않고 어플리케이션이 공개되면 man-in-the-middle 공격에 노출될 수 있습니다.
테스트 목적으로 신뢰할 수 없는 인증서를 수락하는 권장 방법은 인증서를 서명한 CA(인증 기관) 인증서를 iOS Simulator 또는 iOS 장치로 가져오는 것입니다.iOS Simulator가 다음과 같은 장소에서 이 작업을 수행하는 방법을 설명하는 간단한 블로그 투고를 작성했습니다.
IOS 시뮬레이터를 사용한 신뢰할 수 없는 증명서 수용
NSURLRequest
고 has불 called called called called called called called called called called called called called called called called called called called called called 라는 개인 방법이 있습니다.setAllowsAnyHTTPSCertificate:forHost:
「 」를 정의할 수 .allowsAnyHTTPSCertificateForHost:
의 메서드입니다.NSURLRequest
하여 반환하도록 합니다.YES
덮어쓸 호스트에 대해 선택합니다.
받아들여지고 있는 답변을 보완하기 위해 보안을 강화하기 위해 서버 증명서 또는 루트 CA 증명서를 키 체인(https://stackoverflow.com/a/9941559/1432048),에 추가할 수 있습니다.단, 이것만으로는 NSURLConnection이 자동으로 자기 서명 서버를 인증하지 않습니다.다음 코드를 NSURLC Connection 위임자에게 추가해야 합니다. 이 코드는 Apple 샘플 코드 Advanced에서 복사되었습니다.URL 연결. 애플 샘플 코드의 2개의 파일(Credentials.h, Credentials.m)을 프로젝트에 추가해야 합니다.
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
// if ([trustedHosts containsObject:challenge.protectionSpace.host])
OSStatus err;
NSURLProtectionSpace * protectionSpace;
SecTrustRef trust;
SecTrustResultType trustResult;
BOOL trusted;
protectionSpace = [challenge protectionSpace];
assert(protectionSpace != nil);
trust = [protectionSpace serverTrust];
assert(trust != NULL);
err = SecTrustEvaluate(trust, &trustResult);
trusted = (err == noErr) && ((trustResult == kSecTrustResultProceed) || (trustResult == kSecTrustResultUnspecified));
// If that fails, apply our certificates as anchors and see if that helps.
//
// It's perfectly acceptable to apply all of our certificates to the SecTrust
// object, and let the SecTrust object sort out the mess. Of course, this assumes
// that the user trusts all certificates equally in all situations, which is implicit
// in our user interface; you could provide a more sophisticated user interface
// to allow the user to trust certain certificates for certain sites and so on).
if ( ! trusted ) {
err = SecTrustSetAnchorCertificates(trust, (CFArrayRef) [Credentials sharedCredentials].certificates);
if (err == noErr) {
err = SecTrustEvaluate(trust, &trustResult);
}
trusted = (err == noErr) && ((trustResult == kSecTrustResultProceed) || (trustResult == kSecTrustResultUnspecified));
}
if(trusted)
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
이건 칭찬할 수 없지만, 제가 찾은 건 제 욕구에 아주 잘 맞는 것 같아요. shouldAllowSelfSignedCert
의 나 my이다BOOL
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.NSURLConnection
연결별로 빠른 바이패스에 참여해야 합니다.
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)space {
if([[space authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) {
if(shouldAllowSelfSignedCert) {
return YES; // Self-signed cert will be accepted
} else {
return NO; // Self-signed cert will be rejected
}
// Note: it doesn't seem to matter what you return for a proper SSL cert
// only self-signed certs
}
// If no other authentication is required, return NO for everything else
// Otherwise maybe YES for NSURLAuthenticationMethodDefault and etc.
return NO;
}
iOS 9에서는 유효하지 않거나 자체 서명된 모든 인증서에 대해 SSL 연결이 실패합니다.이는 iOS 9.0 이상 및 OS X 10.11 이상에서 새로운 App Transport Security 기능의 기본 동작입니다.
은, 이 동작보다 할 수 .Info.plist
「」를 설정해 주세요.NSAllowsArbitraryLoads
로로 합니다.YES
NSAppTransportSecurity
사전.단, 테스트 목적으로만 이 설정을 덮어쓸 것을 권장합니다.
자세한 내용은 여기에서 App Transport Technote를 참조하십시오.
게시된 API하며 Nathan de Vries의 AppStore를 제어할 수 경우에 합니다.이러한 회피책은 사용자가 이 기능을 제어할 수 없는 경우에 도움이 됩니다.NSUrlConnection
「 」의로서 「 」를 들 수 있습니다.NSXMLParser
URL은 .NSURLRequest
★★★★★★★★★★★★★★★★★」NSURLConnection
.
4 에서는, 이 하고 있는 것 4 의 디바이스에서만 .allowsAnyHTTPSCertificateForHost:
더 이상 방법을 사용할 수 없습니다.
쓰셔야 돼요.NSURLConnectionDelegate
HTTPS의 iOS8입니다.
폐지:
connection:canAuthenticateAgainstProtectionSpace:
connection:didCancelAuthenticationChallenge:
connection:didReceiveAuthenticationChallenge:
대신 다음과 같이 선언해야 합니다.
connectionShouldUseCredentialStorage:
할 필요가 하기 위해 됩니다.- URL은 credential 스토리지를 사용합니다.
connection:willSendRequestForAuthenticationChallenge:
- 챌린지 - 인증 챌린지 요구를 송신합니다.
★★★★★★★★★★★★★★★★ willSendRequestForAuthenticationChallenge
하면 .challenge
예를 들어 다음과 같이 권장되지 않는 메서드를 사용한 경우와 같습니다.
// Trusting and not trusting connection to host: Self-signed certificate
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
자기 생성 증명서에 대한 적절한 인증(및 무료 증명서 취득 방법 - Cocanetics의 댓글 참조)을 할 수 있는 Gist 코드(다른 사람의 작품을 참고)를 게재했습니다.
내 코드는 여기 github입니다.
이 코드를 사용할 수 있습니다.
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([[challenge protectionSpace] authenticationMethod] == NSURLAuthenticationMethodServerTrust)
{
[[challenge sender] useCredential:[NSURLCredential credentialForTrust:[[challenge protectionSpace] serverTrust]] forAuthenticationChallenge:challenge];
}
}
-connection:willSendRequestForAuthenticationChallenge:
폐지:
-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
-(void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
sendSynchronousRequest i를 계속 사용하려면 다음 솔루션을 사용합니다.
FailCertificateDelegate *fcd=[[FailCertificateDelegate alloc] init];
NSURLConnection *c=[[NSURLConnection alloc] initWithRequest:request delegate:fcd startImmediately:NO];
[c setDelegateQueue:[[NSOperationQueue alloc] init]];
[c start];
NSData *d=[fcd getData];
여기서 확인할 수 있습니다: Objective-C SSL Synchronous Connection
AFNetworking에서는, 이하의 코드로 https Web 서비스를 정상적으로 소비하고 있습니다.
NSString *aStrServerUrl = WS_URL;
// Initialize AFHTTPRequestOperationManager...
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
manager.securityPolicy.allowInvalidCertificates = YES;
[manager POST:aStrServerUrl parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject)
{
successBlock(operation, responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
errorBlock(operation, error);
}];
언급URL : https://stackoverflow.com/questions/933331/how-to-use-nsurlconnection-to-connect-with-ssl-for-an-untrusted-cert
'programing' 카테고리의 다른 글
여러 열에 그룹 기준 사용 (0) | 2023.04.16 |
---|---|
로그아웃 후 다시 로그인하지 않고 .bashrc 설정을 새로고침하려면 어떻게 해야 합니까? (0) | 2023.04.16 |
2개의 리스트에 걸쳐 반복하여 각 리스트에서1개의 요소를 얻는 더 좋은 방법이 있을까요? (0) | 2023.04.16 |
C#에서 문자를 반복하는 가장 좋은 방법 (0) | 2023.04.16 |
MVVM 및 VM 컬렉션 (0) | 2023.04.16 |