Доверяйте неверный сертификат с DisableEvaluation на Alamofire - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно связаться с 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)
    }

1 Ответ

0 голосов
/ 22 ноября 2018

Я бы предложил добавить этот обработчик для события sessionDidReceiveChallenge для делегата SessionManager.

let challengeHandler: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))? = { result, challenge in
    return (.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
}

И затем назначить закрытие при инициализации manager Объект таким образом.

manager.delegate.sessionDidReceiveChallenge = challengeHandler

Кроме того, serverTrustPolicies могут быть пустыми, так как обработчик будет игнорировать все вызовы доверия, которые он получит.

...