Я создаю приложение iPad, которое обращается к веб-службам HTTPS. Я хочу реализовать пиннинг, но у меня проблемы.Сертификат в Alamofire
Этот класс создает менеджер Alamofire (в основном взят из документации):
class NetworkManager {
var manager: Manager?
init() {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"www.google.co.uk": .PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
),
"insecure.expired-apis.com": .DisableEvaluation
]
manager = Alamofire.Manager(
configuration: NSURLSessionConfiguration.defaultSessionConfiguration(),
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
}
}
Эта функция делает вызов:
static let networkManager = NetworkManager()
public static func testPinning() {
networkManager.manager!.request(.GET, "https://www.google.co.uk").response { response in
if response.1 != nil {
print("Success")
print(response.1)
print(response.1?.statusCode)
} else {
print("Error")
print(response.3)
}
}
}
certificate is saved в проекте и показывает под «целью> Построить Фазы > Копировать ресурсы Bundle.
В настоящее время я получаю следующее сообщение об ошибке каждый раз, когда я делаю запрос (от блока еще в testPinning()
):
Optional(Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=https://www.google.co.uk/, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://www.google.co.uk/})
Какой сертификат вы включили? Вы проверили, что возвращает ServerTrustPolicy.certificatesInBundle() '(т. Е. Если он действительно включает сертификат)? Не удивительно, если бы Google использовала несколько сертификатов для одного домена. – jcaron
'ServerTrustPolicy.certificatesInBundle()' возвращает 0, чего я не понимаю. Есть ли конкретный способ добавления сертификатов .cer в комплект? Что касается Google, это пример сайта для замены того, который я разрабатываю, но проблема выше. –
Вы имеете в виду, что он возвращает пустой массив? Возвращаемое значение этого вызова должно быть массивом, а не числом. Вы можете попробовать 'NSBundle.mainBundle(). PathsForResourcesOfType (". Cer ", inDirectory: nil)', чтобы увидеть, найден ли файл в комплекте (если это так, то это, вероятно, указывает на проблему с сертификатом содержимое файла). Все, что появляется в журналах, когда вызывается 'ServerTrustPolicy.certificatesInBundle()'? – jcaron