2012-10-19 13 views
26

के साथ अनुमति देना चाहता हूं, मैं अमान्य SSL प्रमाणपत्रों को अनुमति देना चाहता हूं। मेरा मुख्य कोड के नीचे है:मैं अवैध SSL प्रमाणपत्रों को AFNetworking

myClient = [[MyClient alloc] init]; 
[myClient getHtml:@"/path/to/the/distination.html"]; 

MyClient वर्ग कोड के नीचे है:

#import <Foundation/Foundation.h> 
#import "AFNetworking.h" 

@interface MyClient : NSObject 

- (void)getHtml:(NSString *)path; 

@end 

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 

@implementation MyClient 

- (void)getHtml:(NSString *)path 
{ 
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://trusted.server.net"]]; 
    [httpClient getPath:path parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"%@", responseObject); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"error = %@", error); 
    }]; 
} 

@end 

मैं पेज नीचे पढ़ सकते हैं और मैक्रो कोशिश की, लेकिन यह काम नहीं करता।

स्व-हस्ताक्षरित प्रमाणपत्र एसएसएल · अंक # 189 · AFNetworking/AFNetworkinghttps://github.com/AFNetworking/AFNetworking/issues/189

कृपया मेरी मदद करो ...

उत्तर

40

AFNetworking के साथ अमान्य SSL प्रमाणपत्र की अनुमति देने के लिए। AFURLConnectionOperation.h में निम्न पंक्ति #import Availability.h

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1 
+13

संस्करण 1.2.1 के अनुसार, आपको इस परिभाषा को सेट करने के लिए अब और आवश्यकता नहीं है। इसके बजाय आप AFHTTPRequestOperation पर 'allowInvalidSSLCertificate' प्रॉपर्टी को YES पर सेट कर सकते हैं, जो कि अधिक सुविधाजनक है। – Phil

+0

यदि आप ऐसा करते हैं, तो सुनिश्चित करें कि आप इसे केवल डीबग मोड में कर रहे हैं। यदि आप HTTPS एंडपॉइंट्स को मार रहे हैं और आप अमान्य चेतावनी की अनुमति देते हैं तो आप SSL से प्राप्त सुरक्षा का एक अच्छा हिस्सा खो रहे हैं। –

+6

क्या UIImageView + AFNetworking के साथ काम करने के लिए InvalidSSLCertificate को अनुमति देने का कोई तरीका है? –

8

ध्यान दें कि अगर आप CocoaPods के माध्यम से स्थापित कर रहे हैं, #define अपनी परियोजना में इस मैक्रो आईएनजी पर्याप्त नहीं होगा - स्थिर लाइब्रेरी को प्रभावी होने के लिए संकलित करते समय संकलक मैक्रो सेट किया जाना चाहिए।

+2

"संकलक मैक्रो जब ताकि इसे प्रभावी करने के लिए में स्थिर पुस्तकालय संकलन सेट किया जाना चाहिए" - आप कैसे करते हैं ? –

4

आप AFHttpClient उपवर्ग, और ओवरराइड

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)request 
               success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
               failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 

यह मेरा कोड है चाहिए।

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure 
{ 
    AFHTTPRequestOperation *operation = [super HTTPRequestOperationWithRequest:urlRequest success:success failure:failure]; 

    [operation setAuthenticationAgainstProtectionSpaceBlock:^BOOL(NSURLConnection *connection, NSURLProtectionSpace *protectionSpace) { 
     return YES; 
    }]; 
    [operation setAuthenticationChallengeBlock:^(NSURLConnection *connection, NSURLAuthenticationChallenge *challenge) { 
     if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
     } 
    }]; 
    return operation; 
} 

आप इस httpclient का उपयोग करते हैं और यह स्वयं-हस्ताक्षरित वेब को सफलतापूर्वक एक्सेस कर सकता है।

+0

आपको इसके लिए उप-वर्ग क्यों करना है? ऐसा लगता है कि आप कहीं से भी सुरक्षा स्थान और प्रमाणीकरण चुनौती ब्लॉक जोड़ सकते हैं, या क्या मुझे कुछ याद आ रहा है? –

+0

यदि आप स्वयं-हस्ताक्षरित कॉर्ट को प्रोग्रामेटिक रूप से अनुमति देना चाहते हैं और अभी भी AFHTTP क्लाइंट का उपयोग करना चाहते हैं, तो आपको इसे इस तरह से करने की आवश्यकता है। दुर्भाग्यवश AFHTTPClient के लिए कोई समतुल्य 'setAuthenticationAgainstProtectionSpaceBlock' नहीं है। – bobics

24

नीचे जोड़े अब आप AFHTTPClient की allowsInvalidSSLCertificate संपत्ति का उपयोग कर सकते हैं। AFNetworking के नवीनतम संस्करणों में परिभाषित करने की कोई आवश्यकता नहीं है।

AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:@"url"]; 
client.allowsInvalidSSLCertificate = YES; //this defaults to no 
+0

AFNetworking संस्करण के लिए पहले 2.0 – NAlexN

1

This AFNetworking साथ allowign अमान्य SSL प्रमाणपत्र के लिए सबसे अच्छा तरीका है।

use add a _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ to

project > Build Settings > Preprocessor Macros and add it to Debug entry.

यह मदद करता है

12

मैं RestKit उपयोग कर रहा हूँ तो

client.allowsInvalidSSLCertificate = YES; 

काम नहीं करता है आशा है। विकल्प restkit द्वारा बनाए गए संचालन के लिए प्रचारित नहीं है।

मैं कोकोपोड का उपयोग कर रहा हूं ताकि पीएच फ़ाइल या फोड प्रोजेक्ट में कोई भी बदलाव ओवरड्रिन हो। "हैक" मैं उपयोग कर रहा हूं एक कोकोपॉड पोस्ट-इंस्टॉलेशन ऑपरेशन है जो आवश्यक प्रीप्रोसेसर परिभाषा जोड़ता है। मेरी पॉड फ़ाइल के अंत में मैंने जोड़ा है:

post_install do |installer_representation| 
    installer_representation.project.targets.each do |target| 
    if target.name == 'Pods-AFNetworking' 
     target.build_configurations.each do |config| 
     config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)'] 
     config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << '_AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1' 
     end 
    end 
    end 
end 
+1

आईओएस 7 और एक्सकोड 5 पर काम नहीं करता है, यह मेरे लिए चाल है। मैं AFNetworking 1.3.3 – Humber

+0

ओएमजी का उपयोग कर रहा हूँ! आपको बहुत - बहुत धन्यवाद! –

+0

इससे मुझे भी मदद मिली। अच्छी चीज़। – bleeckerj

44

AFNetworking 2 में।0, आप उपयोग कर सकते हैं निम्नलिखित:

[AFHTTPRequestOperationManager manager].securityPolicy.allowInvalidCertificates = YES; 
+0

इससे मदद मिलती है। मैंने जोड़ा "self.securityPolicy.allowInvalidCertificates = हाँ;" AFHTTPRequestOperationManager init विधि में। –

1

यदि आप उपयोग RestKit उपयोग कर रहे हैं

client.allowsInvalidSSLCertificate = YES; 

काम नहीं करेगा, तब यह कार्य करें:

अगर आप अपनी परियोजना के लिए मैन्युअल रूप से आराम किट जोड़ा ,> जाने RestKit.xcodeproj पर क्लिक करें परियोजना के लिए सेटिंग्स का निर्माण> प्रीप्रोसेसर मैक्रो

और जोड़ने _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1

समाप्त हो गया।

+1

वर्तमान में ऑब्जेक्ट प्रबंधक। एचटीटीपी क्लाइंट.allowsInvalidSSLCertificate = हाँ; या RestKit कार्यों में कुछ समान है –

2

यदि आप उपयोग RestKit उपयोग कर रहे हैं

client.allowsInvalidSSLCertificate = YES; 

काम नहीं करेगा, तब यह कार्य करें: अपनी परियोजना में

, RestKit.xcodeproj पर क्लिक करें प्रोजेक्ट> सेटिंग> प्रीप्रोसेसर मैक्रो

बिल्ड

और _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_=1

समाप्त हो गया।

5

यहां पोस्ट प्रबंधक के लिए प्रबंधक का उपयोग करके आप इसे कैसे कर सकते हैं।

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; //initialize 
manager.securityPolicy.allowInvalidCertificates=YES; //allow unsigned 
manager.responseSerializer=[AFJSONResponseSerializer serializer]; //set up for JSOn 
[manager POST:@"myweb.com" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //success stuff 
}failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //error stuff 
}]; 

संपादित करें - तेज संस्करण:

var securityPolicy = AFSecurityPolicy() 
    securityPolicy.allowInvalidCertificates = true; 
    manager.securityPolicy = securityPolicy; 
    manager.POST(
     "https://exmaple.com/foobar.php", 
     nil, 
    ... 
3

AFHTTPRequestOperation * आपरेशन = [[AFHTTPRequestOperation alloc] initWithRequest: URLRequest]; operation.securityPolicy.allowInvalidCertificates = हाँ;

0

मुझे एक ही समस्या का सामना करना पड़ा और मैंने जो समाधान पढ़े हैं उनमें से कोई भी नहीं।

मेरे लिए केवल वैकल्पिक हल इस तरह AFSecurityPolicy सेट है:

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; 
securityPolicy.allowInvalidCertificates = YES; 
manager.securityPolicy = securityPolicy; 

मैं जवाब देने के लिए हालांकि सवाल पुराना है, हो सकता है किसी की मदद कर सकते हैं का फैसला किया।

4

मैंने अपने कोड में AFHTTPSessionManager को बढ़ाया। जब एक परीक्षण सर्वर के खिलाफ परीक्षण, सब मैं की जरूरत है इस तरह आपको एक पंक्ति जोड़ जाता है:

mySessionManager.securityPolicy.allowInvalidCertificates = YES; 
संबंधित मुद्दे