Не удалось применить закрепление сертификата с помощью Alamofire 5.0.2 - PullRequest
0 голосов
/ 04 марта 2020

Я перевожу мое приложение для использования Alamofire 5.0.2, в прошлой версии оно использовало Alamofire 4.x, и закрепление сертификата работает нормально.

Затем я перенес Alamofire и его конфигурацию закрепления сертификата с этими изменения:


//Usage example of the function `defaultSessionManager`
class ViewController: UIViewController {

    let sessionManager = defaultSessionManager(defaultRequestInterceptor())
    //...
}

private func defaultSessionManager(_ requestInterceptor: RequestInterceptor?) -> Alamofire.Session {

  let evaluators: [String: ServerTrustEvaluating] = [
    "https://myapp.com": PinnedCertificatesTrustEvaluator(certificates: pinnedCertificates()),
  ]

  let configuration: URLSessionConfiguration = URLSessionConfiguration.af.default
  configuration.timeoutIntervalForRequest = 10 // seconds
  configuration.timeoutIntervalForResource = 10 // seconds

  return Alamofire.Session(
    configuration: configuration,
    interceptor: requestInterceptor,
    serverTrustManager: ServerTrustManager(evaluators: evaluators))
}

func pinnedCertificates() -> [SecCertificate] {

  var certificates: [SecCertificate] = []
  let directoryContents: [URL] = //...

  let certificateName: String = "app.cer" // Replaced for the demo

  let pinnedCertificateURL: URL? = directoryContents.first { (url: URL) in url.lastPathComponent == certificateName }

  if let pinnedCertificateURL: URL = pinnedCertificateURL {
    do {
      let pinnedCertificateData: CFData = try Data(contentsOf: pinnedCertificateURL) as CFData
      if let pinnedCertificate: SecCertificate = SecCertificateCreateWithData(nil, pinnedCertificateData) {
        certificates.append(pinnedCertificate)
      }
    } catch {
        //...
    }
  }
  return certificates
}

При решении выше, я получаю ошибку:

MyApp[374:21470] Task <DDC8F9FD-81A3-EBA4-8AA2-D7C99DD3E63B>.<1> HTTP load failed, 0/0 bytes (error code: -999 [1:89])

Если я удаляю строку serverTrustManager: ServerTrustManager(evaluators: evaluators)), Alamofire работает, но без закрепления сертификата.

Есть идеи, как решить эту проблему и что я делаю не так?

Спасибо.

1 Ответ

1 голос
/ 04 марта 2020

String в вашем отображении оценщика должен быть только хостом, а не полным URL:

let evaluators: [String: ServerTrustEvaluating] = [
    "myapp.com": PinnedCertificatesTrustEvaluator(certificates: pinnedCertificates()),
  ]

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

Кроме того, Alamofire автоматически найдет сертификаты в вашем комплекте, поэтому вам может не потребоваться найти его самостоятельно.

...