У нас есть корпоративное приложение, которое содержит WKWebView
, которому необходим доступ к сайту, требующему сертификата на стороне клиента.
Требуемый сертификат клиента установлен на устройстве, и мы можем получить доступ к защищенномусайт в сафари.В настоящее время сертификат клиента загружается и доверяется вручную.
Однако, когда мы пытаемся получить доступ к тому же сайту в пределах WKWebView
в нашем приложении, сайт возвращает HTTP 400, потому что он не может найти сертификат на стороне клиента.
Я попробовал следующую реализацию соответствующего метода navigationDelegate
:
print("authentication challenge: \(challenge)")
guard let trust = challenge.protectionSpace.serverTrust else {
print("no server trust: \(challenge.protectionSpace)")
completionHandler(URLSession.AuthChallengeDisposition.useCredential, nil)
return
}
print("using server trust: \(challenge.protectionSpace)")
let cred = URLCredential(trust: trust)
completionHandler(.useCredential, cred)
}
Когда этот метод вызывается для сертификата клиента, challenge.protectionSpace.serverTrust
не существует.
Если я помещу клиентский сертификат в комплект приложения (как правило, не рекомендуется и не является приемлемым вариантом для производственного использования), загрузите его и сообщите WKWebView использовать эти учетные данные в обратном вызове completionHandler()
, затем сайт загрузится.
Насколько я понимаю, WKWebView
должен иметь доступ к тем же сертификатам на стороне клиента, что и Safari, поэтому я затрудняюсь объяснить, почему это не работает.
Кто-нибудь знаетспособа заставить WKWebView
использовать общесистемные клиентские сертификаты?