Мне нужно связаться с API, который имеет недействительный сертификат и базовый Auth. Когда я искал, мне нужно было написать собственный SessionManager и добавить значение в файл plist. После нескольких дней поиска и множества постов я все еще не могу добраться до API.
struct CustomManagerClass{
static let instance = CustomManagerClass()
var sessionManager : SessionManager = {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"baseurl.com:8443": .disableEvaluation
]
// Create custom manager
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders
let manager = Alamofire.SessionManager(
configuration: configuration,
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
return manager
}()
Файл Plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>baseurl.com</key>
<dict>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
Как я это называю:
CustomManagerClass.instance.sessionManager.request(route).responseJSON(completionHandler: { (result) in
completion(result)
}) //Route in here is a ServiceConfiguration class which defines http method, parameters and basic auth.
Он все еще возвращается;
Задание <4CE5991B-2650-471C-AB77-69D54B8E36F3>. <1> завершено с ошибкой - код: -1202
Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, который притворяется «baseurl.com», что может поставить под угрозу вашу конфиденциальную информацию.
Сообщений, которые я получил помощь:
Недействительный сертификат с Alamofire 4.0
Как использовать Alamofires ServerTrustPolicy.disableEvaluation in swift 3
РЕДАКТИРОВАТЬ: Я добавляю ниже код доверенного сертификата. Теперь возвращает HTTP 500
CustomManagerClass.instance.sessionManager.delegate.sessionDidReceiveChallenge = { session, challenge in
var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
var credential: URLCredential?
print("received challenge")
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
disposition = URLSession.AuthChallengeDisposition.useCredential
credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)
} else {
if challenge.previousFailureCount > 0 {
disposition = .cancelAuthenticationChallenge
} else {
credential = CustomManagerClass.instance.sessionManager.session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)
if credential != nil {
disposition = .useCredential
}
}
}
return (disposition, credential)
}