में स्वयं हस्ताक्षरित प्रमाणपत्र को सत्यापित करने (और आवश्यकताएं) कैसे करें IOS में कोड के साथ भेजे गए स्व-हस्ताक्षरित प्रमाणपत्रों का उपयोग करके मैं अपने सर्वर से एक एसएसएल कनेक्शन बनाना चाहता हूं। इस तरह मुझे अधिक परिष्कृत मानव-इन-द-बीच हमलों के बारे में चिंता करने की ज़रूरत नहीं है, जहां किसी के पास उच्च स्तर "विश्वसनीय" प्रमाण प्राधिकरण तक पहुंच है। मुझे ऐसा लगता है कि मैं ऐप्पल के मानक तरीके से विश्वास करता हूं।आईओएस
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
if ([protectionSpace authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
// Load anchor cert.. also tried this with both certs and it doesn't seem to matter
NSString *path = [[NSBundle mainBundle] pathForResource:@"root.der" ofType:@"crt"];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
SecCertificateRef anchorCert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)data);
CFMutableArrayRef anchorCerts = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
CFArrayAppendValue(anchorCerts, anchorCert);
// Set anchor cert
SecTrustRef trust = [protectionSpace serverTrust];
SecTrustSetAnchorCertificates(trust, anchorCerts);
SecTrustSetAnchorCertificatesOnly(trust, YES); // only use that certificate
CFRelease(anchorCert);
CFRelease(anchorCerts);
// Validate cert
SecTrustResultType secresult = kSecTrustResultInvalid;
if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) {
[challenge.sender cancelAuthenticationChallenge:challenge];
return;
}
switch (secresult) {
case kSecTrustResultInvalid:
case kSecTrustResultDeny:
case kSecTrustResultFatalTrustFailure:
case kSecTrustResultOtherError:
case kSecTrustResultRecoverableTrustFailure: {
// !!! It's always kSecTrustResultRecoverableTrustFailure, aka 5
NSLog(@"Failing due to result: %lu", secresult);
[challenge.sender cancelAuthenticationChallenge:challenge];
return;
}
case kSecTrustResultUnspecified: // The OS trusts this certificate implicitly.
case kSecTrustResultProceed: { // The user explicitly told the OS to trust it.
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
[challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
return;
}
default: ;
/* It's somebody else's key. Fall through. */
}
/* The server sent a key other than the trusted key. */
[connection cancel];
// Perform other cleanup here, as needed.
} else {
NSLog(@"In weird space... not handling authentication method: %@", [protectionSpace authenticationMethod]);
[connection cancel];
}
}
मैं हमेशा परिणाम के रूप में kSecTrustResultRecoverableTrustFailure हो रही है:
प्रमाणपत्र जनरेट कर रहा है, प्रक्रिया के माध्यम से here
# Create root CA & private key
openssl req -newkey rsa:4096 -sha512 -days 9999 -x509 -nodes -out root.pem.cer
# Create a certificate signing request
openssl req -newkey rsa:4096 -sha512 -nodes -out ssl.csr -keyout ssl.key
# Create an OpenSSL Configuration file from http://svasey.org/projects/software-usage-notes/ssl_en.html
vim openssl.conf
# Create the indexes
touch certindex
echo 000a > certserial
echo 000a > crlnumber
# Generate SSL certificate
openssl ca -batch -config openssl.conf -notext -in ssl.csr -out ssl.pem.cer
# Create Certificate Revocation List
openssl ca -config openssl.conf -gencrl -keyfile privkey.pem -cert root.pem.cer -out root.crl.pem
openssl crl -inform PEM -in root.crl.pem -outform DER -out root.crl && rm root.crl.pem
और आईओएस कोड मिला। मुझे नहीं लगता कि यह लोकलहोस्ट मुद्दा है क्योंकि मैंने इसे बदलने के लिए ऐप्पल के कोड का उपयोग करने का प्रयास किया है। क्या करें?
धन्यवाद!
आपको 'canAuthenticateAgainstProtectionSpace' और' didReceiveAuthenticationChallenge' दोनों को ओवरराइड करने की आवश्यकता है। 'TrustResultRecoverableTrustFailure' का अर्थ है कि आप सर्वर सत्यापन के परिणाम को बदल सकते हैं। [सार्वजनिक कुंजी पिनिंग] (http://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#iOS) पर ओडब्ल्यूएएसपी की आईओएस पब्लिक की पिनिंग उदाहरण भी देखें। – jww