Ручная проверка подлинности сервера - PullRequest
0 голосов
/ 12 января 2019

В моем приложении я делаю запрос к серверу с самозаверяющим сертификатом. Я обрабатываю URLAuthenticationChallenge в пользовательском делегате.

В этом делегате я могу автоматически доверять серверу без проблем. Однако я хочу использовать соответствующий файл root.crt для оценки доверия к серверу. Файл root.crt входит в комплект приложения. У меня есть функция, которая проверяет, можно ли доверять серверу, используя файл root.crt. Однако, это не работает так, как я думаю. Вот моя попытка написать функцию, которая проверяет сервер на наличие файла root.crt.

func checkValidity(of secTrust: SecTrust) -> Bool {
    // get path to certificate
    guard let url = Bundle.main.url(forResource: "root", withExtension: "crt") else {
        print("No root certificate found")
        return false
    }

    // read root.crt data
    guard let certData = NSData(contentsOf: url) else {
        print("Unable to get data from root.crt")
        return false
    }

    // get a pointer to the certificate
    var rawPtr = Optional(certData.bytes)
    let unsafePtr = withUnsafeMutablePointer(to: &rawPtr, { $0 })

    // create an array containing the certificate data
    guard let certs = CFArrayCreate(nil, unsafePtr, 1, nil) else {
        return false
    }

    // add the certificate as an anchor certificate
    SecTrustSetAnchorCertificates(secTrust, certs)
    SecTrustSetAnchorCertificatesOnly(secTrust, false)

    var result = SecTrustResultType.deny
    let resultPtr = withUnsafeMutablePointer(to: &result, { $0 })
    SecTrustEvaluate(secTrust, resultPtr)

    if result == .proceed || result == .unspecified {
        return true
    } else {
        return false
    }
}

Проблема в том, что что-то идет не так при попытке установить сертификаты привязки. Если кто-нибудь знает, как проверить самозаверяющий сервер сертификатов на файл crt, любая помощь будет признательна.

...