Я пытаюсь выполнить HTTPS-запрос в службе XPC, используя NSURLSessionDataTask
. Это сбой и даже ожидается сбой, поскольку сервер использует сертификат TLS, подписанный ЦС, неизвестным системе.
Итак, я реализовал протокол NSURLSessionDelegate
, реализовал метод URLSession:didReceiveChallenge:completionHandler:
,получил объект SecTrustRef
, добавил сертификат CA к нему (который поставляется с моей службой XPC) и оценил доверие с помощью SecTrustEvaluate()
. Если я сначала оцениваю без добавления своего ЦС, система говорит, что сертификат не является доверенным, если я делаю это после добавления ЦС, система говорит, что он является доверенным, поэтому, очевидно, я все делаю правильно. Наконец я звоню
NSURLCredential * credential = [NSURLCredential credentialForTrust:trust];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
И соединение ... все равно не удается. И все равно происходит сбой с точно такой же ошибкой, как если бы я вообще не использовал этот делегат (NSURLErrorSecureConnectionFailed
). Точно такой же код работал нормально в другом проекте. Даже когда я вообще ничего не оцениваю и просто реализую метод следующим образом:
- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition,
NSURLCredential * _Nullable))completionHandler
{
NSString * method = challenge.protectionSpace.authenticationMethod;
if (![method isEqualToString:NSURLAuthenticationMethodServerTrust]) {
completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
return;
}
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
if (!serverTrust) {
completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
return;
}
NSURLCredential * credential = [NSURLCredential credentialForTrust:serverTrust];
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}
Соединение по-прежнему не работает с ошибкой NSURLErrorSecureConnectionFailed
.