অবিশ্বস্ত শংসাপত্রের জন্য এসএসএলের সাথে সংযোগ স্থাপনের জন্য এনএসআরএল সংযোগটি কীভাবে ব্যবহার করবেন?


300

একটি এসএসএল ওয়েবপৃষ্ঠায় সংযোগ করার জন্য আমার কাছে নিম্নলিখিত সাধারণ কোড রয়েছে

NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];

যদি শংসাপত্রটি স্ব স্ব স্বাক্ষরিত হয় তবে এটি একটি ত্রুটি দেয় তবে Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".যেভাবেই কোনও সংযোগ গ্রহণের জন্য সেট করার কোনও উপায় আছে (ঠিক তেমন কোনও ব্রাউজারে আপনি গ্রহণ করতে চাপতে পারেন) বা এটিকে বাইপাস করার কোনও উপায়?

উত্তর:


415

এটি সম্পাদন করার জন্য একটি সমর্থিত API রয়েছে! আপনার 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:এর বার্তাটি চ্যালেঞ্জে পাঠাতে পারে seসেন্ডার (অনেক পরে), প্রয়োজনে ব্যবহারকারীর কাছে একটি ডায়ালগ বক্স উপস্থাপনের পরে, ইত্যাদি etc.


31
অনেক অনেক ধন্যবাদ, এটি নিখুঁতভাবে কাজ করে। আপনি যদি কোনও https সাইট গ্রহণ করতে চান তবে কেবল দুটি আইএফস অপসারণ করুন এবং কেবলমাত্র ব্যবহারের কেন্দ্রিয় অংশটি ডিডের রিসিপআউটিফিকেশনচ্যালেন কলব্যাকের মধ্যে রাখুন।
ইয়োনেল

19
একটি বিশ্বস্ত হোস্ট কী, যেখানে এন কীভাবে সংজ্ঞায়িত হয়
আমেয়া

7
আমেয়া, এটি এনএসএসস্ট্রিং অবজেক্টগুলির একটি এনএসআরাই হবে। স্ট্রিংগুলি হ'ল @ "গুগল.কম" এর মত নাম।
উইলিয়াম ডেনিস

19
এই কোডটি ভাল কাজ করে। তবে মনে রাখবেন যে বৈধ শংসাপত্রের পুরো বিষয়টি হ'ল ম্যান-ইন-মধ্য-আক্রমণকে প্রতিরোধ করা। সুতরাং আপনি যদি এই কোডটি ব্যবহার করেন তবে সচেতন হন, কেউ তথাকথিত "বিশ্বস্ত হোস্ট" কে ছদ্মবেশী করতে পারেন। আপনি এখনও এসএসএলের ডেটা এনক্রিপশন বৈশিষ্ট্যগুলি পান তবে আপনি হোস্টটি সনাক্তকরণের বৈধতা বৈশিষ্ট্যগুলি হারাবেন।
উইলিয়াম ডেনিস

42
এই পদ্ধতিগুলি এখন আইওএস 5.0 এবং ম্যাক ওএস এক্স 10.6 হিসাবে অবচয় বলে বিবেচিত হয়েছে। -(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeপদ্ধতি পরিবর্তে ব্যবহার করা উচিত।
অ্যান্ড্রু আর।

36

আপনি যদি ব্যক্তিগত API গুলি ব্যবহার করতে ইচ্ছুক (বা অক্ষম) হন তবে ASIHTTPRequest নামে একটি ওপেন সোর্স (BSD লাইসেন্স) লাইব্রেরি রয়েছে যা নিম্ন স্তরের চারপাশে মোড়ক সরবরাহ করে CFNetwork APIs। তারা সম্প্রতি এপিআই HTTPS connections- -setValidatesSecureCertificate:র সাথে স্ব-স্বাক্ষরিত বা অবিশ্বস্ত শংসাপত্রগুলি ব্যবহারের অনুমতি দেওয়ার সক্ষমতা প্রবর্তন করেছে । আপনি যদি পুরো লাইব্রেরিটি টানতে না চান তবে আপনি একই কার্যকারিতাটি বাস্তবায়নের জন্য উত্সটি একটি রেফারেন্স হিসাবে ব্যবহার করতে পারেন।


2
টিম, আপনি যে কোনওভাবেই অ্যাসিঙ্কটি ব্যবহার করতে চাইছেন (যেমন একটি অগ্রগতি বারটি দেখাতে সক্ষম হওয়া), আমি সকলের জন্য খুঁজে পেয়েছি তবে আমি যাচ্ছি তার অনুরোধগুলির মধ্যে সবচেয়ে সহজ। সুতরাং সম্ভবত আপনার এখনই অ্যাসিঙ্কটি বাস্তবায়ন করা উচিত এবং পরে ঝামেলাটি সংরক্ষণ করুন।
উইলিয়াম ডেনিস

(কিন্তু ব্যবহার [R setValidatesSecureCertificate: YES];): বাস্তবায়নের এই দেখুন stackoverflow.com/questions/7657786/...
স্যাম Brodkin

দুঃখিত যে আমি এই বিষয়টিকে ব্যাক আপ করেছি। তবে যেহেতু আইওএস 5 এআরসি বৈশিষ্ট্যগুলি প্রবর্তন করেছে। আমি এখন এই কাজটি কীভাবে করব?
মেলভিন লাই

: যদি আপনি এই চেক করুন গেল stackoverflow.com/q/56627757/1364053
nr5

33

আদর্শভাবে, যখন কোনও আইওএস অ্যাপ্লিকেশনটির একটি অবিশ্বাস্য শংসাপত্র গ্রহণ করা দরকার তখন কেবল দুটি পরিস্থিতি থাকতে হবে।

পরিস্থিতি এ: আপনি একটি পরীক্ষার পরিবেশের সাথে সংযুক্ত আছেন যা স্ব-স্বাক্ষরিত শংসাপত্র ব্যবহার করছে।

পরিস্থিতি বি: আপনি প্রক্সিগুলি HTTPSব্যবহার করে ট্রাফিকের প্রক্সিং করছেন MITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.স্ব স্বাক্ষরিত সিএ স্বাক্ষরিত একটি শংসাপত্র ফিরিয়ে দেবেন যাতে প্রক্সিটি HTTPSট্র্যাফিক ক্যাপচারে সক্ষম হয় ।

উত্পাদন হোস্টগুলির সুস্পষ্ট কারণে কখনও অবিশ্বস্ত শংসাপত্র ব্যবহার করা উচিত নয় ।

আপনার যদি আইওএস সিমুলেটর পরীক্ষার উদ্দেশ্যে একটি অবিশ্বাস্য শংসাপত্র গ্রহণ করতে হয় তবে এটির পক্ষে সুপারিশ করা হয় যে আপনি অ্যাপ্লিকেশন যুক্তি পরিবর্তন করবেন না যাতে আপনি পিআইপি দ্বারা প্রদত্ত বিল্ট ইন শংসাপত্রের বৈধতা অক্ষম করতে পারেন NSURLConnection। যদি এই যুক্তিটি না সরিয়ে অ্যাপ্লিকেশনটি জনসাধারণের কাছে প্রকাশ করা হয় তবে এটি মধ্য-মধ্য-আক্রমণগুলির পক্ষে সংবেদনশীল হবে।

পরীক্ষার উদ্দেশ্যে অবিশ্বস্ত শংসাপত্রগুলি গ্রহণ করার প্রস্তাবিত উপায় হ'ল শংসাপত্র কর্তৃপক্ষ (সিএ) শংসাপত্রটি আমদানি করে যা আপনার আইওএস সিমুলেটর বা আইওএস ডিভাইসে শংসাপত্রটি স্বাক্ষর করে। আমি একটি দ্রুত ব্লগ পোস্ট লিখেছিলাম যা এটি প্রদর্শন করতে পারে যা কোনও আইওএস সিমুলেটর এখানে:

আইওএস সিমুলেটর ব্যবহার করে অবিশ্বস্ত শংসাপত্র গ্রহণ accepting


1
অসাধারণ স্টাফ ম্যান। আমি সম্মত, কোনও অবিশ্বস্ত শংসাপত্র গ্রহণ করার জন্য এই বিশেষ অ্যাপ লজিকটি অক্ষম করা সম্পর্কে ভুলে যাওয়া এত সহজ।
টমাসজ

"আদর্শভাবে, যখন কোনও আইওএস অ্যাপ্লিকেশনটির একটি অবিশ্বাস্য শংসাপত্র গ্রহণ করা প্রয়োজন তখন কেবল দুটি পরিস্থিতি থাকতে হবে।" - একটি সার্টিফিকেট পিন করার সময় 'দাবি করা' ভাল সার্টিফিকেট বাতিল করার বিষয়ে কীভাবে? কনফারার: ​​ডিগনোটার (pwn'd) এবং ট্রাস্টওয়েভ (MitM খ্যাতি)।
jww

কোড মুছে ফেলতে ভুলে যাওয়া সম্পর্কে আপনার বক্তব্যের সাথে পুরোপুরি একমত। বিদ্রূপটি হ'ল স্ব-স্বাক্ষরিত শংসাপত্রগুলি সিমুলেটর গ্রহণের চেয়ে কোডে এই পরিবর্তন করা অনেক সহজ।
ডিভাইস 1

12

NSURLRequestএকটি ব্যক্তিগত পদ্ধতি বলা হয়েছে setAllowsAnyHTTPSCertificate:forHost:, যা আপনার পছন্দ মতো করবে। আপনি কোনও বিভাগের মাধ্যমে allowsAnyHTTPSCertificateForHost:পদ্ধতিটি সংজ্ঞায়িত NSURLRequestকরতে পারেন YESএবং যে হোস্টটি আপনি ওভাররাইড করতে চান সেটি ফিরে আসতে সেট করতে পারেন ।


অননুমোদিত API গুলি সম্পর্কে সাধারণ সতর্কতা প্রয়োগ হয় ... তবে এটি সম্ভব যে জেনে রাখা ভাল।
স্টিফেন ডার্লিংটন

হ্যাঁ, একেবারে। আমি আরও একটি উত্তর যুক্ত করেছি যা ব্যক্তিগত API গুলি ব্যবহারের সাথে জড়িত নয়।
নাথান ডি ভ্রিজ

আপনি যখন "এনএসআরএল সংযোগটি সেনস্রনিকাস রিকোয়েস্ট:" ব্যবহার করেন তখন কি কাজ করে?
টিম বাথ

11

গৃহীত উত্তরের পরিপূরক হিসাবে, আরও ভাল সুরক্ষার জন্য, আপনি আপনার সার্ভার শংসাপত্র বা আপনার নিজস্ব রুট সিএ শংসাপত্রটি কীচেইনে যুক্ত করতে পারেন ( https://stackoverflow.com/a/9941559/1432048 ), তবে একা এটি করা NSURL সংযোগ তৈরি করবে না আপনার স্ব-স্বাক্ষরিত সার্ভারটি স্বয়ংক্রিয়ভাবে প্রমাণীকরণ করুন। আপনাকে এখনও আপনার এনএসআরএল সংযোগ প্রতিনিধিতে নীচের কোডটি যুক্ত করতে হবে, এটি অ্যাপল স্যাম্পল কোড অ্যাডভান্সড ইউআরএল সংযোগগুলি থেকে অনুলিপি করা হয়েছে এবং আপনার প্রকল্পগুলিতে আপেল নমুনা কোড থেকে দুটি ফাইল (শংসাপত্র। শংসাপত্র। এম) যুক্ত করতে হবে।

- (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];
}

10

আমি এর জন্য কোনও ক্রেডিট নিতে পারি না, তবে এটি আমার প্রয়োজনের জন্য সত্যই ভাল কাজ করেছে। shouldAllowSelfSignedCertআমার 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;
}

10

আইওএস 9-তে, সমস্ত অবৈধ বা স্ব-স্বাক্ষরিত শংসাপত্রগুলির জন্য এসএসএল সংযোগগুলি ব্যর্থ হবে। এটি iOS 9.0 বা তার পরে এবং ওএস এক্স 10.11 এবং তারপরে নতুন অ্যাপ ট্রান্সপোর্ট সুরক্ষা বৈশিষ্ট্যের ডিফল্ট আচরণ ।

আপনি এই আচরণ পাল্টাতে পারেন Info.plistসেট করে, NSAllowsArbitraryLoadsকরতে YESমধ্যে NSAppTransportSecurityঅভিধান। তবে আমি কেবল পরীক্ষার উদ্দেশ্যে এই সেটিংটি ওভাররাইড করার পরামর্শ দিচ্ছি।

এখানে চিত্র বর্ণনা লিখুন

তথ্যের জন্য দেখুন অ্যাপ পরিবহন Technote এখানে


একমাত্র সমাধানটি আমার পক্ষে কাজ করেছিল, আমার প্রয়োজন অনুসারে আমার ফায়ারবেস কাঠামো পরিবর্তন করার কোনও উপায় নেই, এটি সমাধান করেছে, ধন্যবাদ!
যিটজাক

এখন আমি দেখেছি যে গুগল অ্যাডমব (ফায়ারবেসে) এর জন্য এনএসএলোআরবিটরিলয়েডস = ইয়েস চেয়েছে। firebase.google.com/docs/admob/ios/ios9
Yitzchak

6

নাথান ডি ভ্রিজের পোস্ট করা বিভাগটি অ্যাপস্টোরের প্রাইভেট এপিআই চেকগুলি পাস করবে এবং এমন ক্ষেত্রে কার্যকর হবে যেখানে আপনার NSUrlConnectionঅবজেক্টের নিয়ন্ত্রণ নেই । একটি উদাহরণ হ'ল NSXMLParserযা আপনার সরবরাহ করা ইউআরএল খুলবে, তবে NSURLRequestবা এটি প্রকাশ করে না NSURLConnection

আইওএস 4-তে এখনও কার্যবিধির কাজ মনে হচ্ছে, তবে কেবলমাত্র ডিভাইসে, সিমুলেটরটি allowsAnyHTTPSCertificateForHost:আর সেই পদ্ধতিতে প্রার্থনা করে না।


6

আপনাকে NSURLConnectionDelegateএইচটিটিপিএস সংযোগের অনুমতি দিতে ব্যবহার করতে হবে এবং আইওএস 8 এর সাথে নতুন কলব্যাক রয়েছে।

থামানো হয়েছে:

connection:canAuthenticateAgainstProtectionSpace:
connection:didCancelAuthenticationChallenge:
connection:didReceiveAuthenticationChallenge:

এগুলির পরিবর্তে, আপনাকে ঘোষণা করতে হবে:

connectionShouldUseCredentialStorage: - সংযোগটি প্রমাণীকরণের জন্য ইউআরএল লোডারকে শংসাপত্রের সঞ্চয়স্থান ব্যবহার করা উচিত কিনা তা নির্ধারণের জন্য পাঠানো হয়েছে।

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];

: যদি আপনি এই চেক করুন গেল stackoverflow.com/q/56627757/1364053
nr5

3

আমি কিছু গিস্ট কোড পোস্ট করেছি (অন্য কারও কাজের উপর ভিত্তি করে যা আমি লক্ষ্য করি) যা আপনাকে স্ব-উত্পন্ন শংসাপত্রের বিরুদ্ধে সঠিকভাবে প্রমাণ করতে দেয় (এবং কীভাবে একটি বিনামূল্যে শংসাপত্র পাবেন - মন্তব্য কোকোনেটিক্সের নীচে দেখুন )

আমার কোডটি এখানে গিথুব


: যদি আপনি এই চেক করুন গেল stackoverflow.com/q/56627757/1364053
nr5

2

আপনি যদি এই সলিউশনটিতে সেন্ডক্রোনাস রিকুয়েস্ট ব্যবহার চালিয়ে যেতে চান তবে :

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];

আপনি এটি এখানে দেখতে পাবেন: উদ্দেশ্য-সি এসএসএল সিঙ্ক্রোনাস সংযোগ


1

সঙ্গে AFNetworking আমি সফলভাবে কোড নিচে সহ https webservice ধ্বংস

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);
}];

1

আপনি এই কোড ব্যবহার করতে পারেন

-(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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.