Запросы URL-адресов с помощью закрепления SSL в приложении iOS не выполняются для нескольких веб-сайтов - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть приложение для iOS, которое имеет функцию закрепления SSL для нескольких конкретных запросов.Так как SSL Pinning по какой-то причине не работает, я скачал сертификаты SSL для 3 сайтов, используя браузер Firefox (или команду openssl в приложении Mac Terminal), и сохранил их в локальной папке проекта.Ниже приведены результаты, когда я запускаю приложение для iOS.

URL: https://www.google.com/
РЕЗУЛЬТАТ: WORKING with ssl enabled - я мог видеть некоторые ответы в виде данных HTML в консоли


URL: https://www.google.com/
РЕЗУЛЬТАТ: cancelled 2019-02-14 15:30:27.702813+0530 CertPinning[30996:733590] Task <B7EEA492-BE74-4E2A-9F47-2F8C964B8539>.<1> finished with error - code: -999 2019-02-14 15:30:27.704132+0530 CertPinning[30996:733596] Task <B7EEA492-BE74-4E2A-9F47-2F8C964B8539>.<1> HTTP load failed (error code: -999 [1:89])


URL: https://api.sendgrid.com/
РЕЗУЛЬТАТ
Error Domain=NSURLErrorDomain Code=-999 "(null)" UserInfo={NSUnderlyingError=0x600001c7dd10 {Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLStringKey=https://api.sendgrid.com/v3/mail/send, NSErrorFailingURLKey=https://api.sendgrid.com/v3/mail/send, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <F7FF95D3-ADC7-474C-8B38-0ABA09058AA8>.<1>" ), _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <F7FF95D3-ADC7-474C-8B38-0ABA09058AA8>.<1>, NSLocalizedDescription=cancelled}}, StatusCode=0, ResponseText=, ServiceType=Login, URL=https://api.sendgrid.com/v3/mail/send}


Код загружен с GITHUB

import Foundation
import UIKit

class ViewController: UIViewController, URLSessionDelegate {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)

        guard let url = URL(string: "https://www.google.com/") else { return }

        let task = session.dataTask(with: url) { (data, response, error) in

            if let error = error {
                print(error.localizedDescription)
                return
            }

            if let data = data, let contents = String(data: data, encoding: String.Encoding.utf8) {
                print(contents)
            }

        }

        task.resume()

    }

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

        guard
            challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
            let serverTrust = challenge.protectionSpace.serverTrust,
            SecTrustEvaluate(serverTrust, nil) == errSecSuccess,
            let serverCert = SecTrustGetCertificateAtIndex(serverTrust, 0) else {

                reject(with: completionHandler)
                return
        }

        let serverCertData = SecCertificateCopyData(serverCert) as Data

        guard
            let localCertPath = Bundle.main.path(forResource: "wwwgooglecom", ofType: "crt"),
            let localCertData = NSData(contentsOfFile: localCertPath) as Data?,

            localCertData == serverCertData else {

                reject(with: completionHandler)
                return
        }

        accept(with: serverTrust, completionHandler)

    }

    func reject(with completionHandler: ((URLSession.AuthChallengeDisposition, URLCredential?) -> Void)) {
        completionHandler(.cancelAuthenticationChallenge, nil)
    }

    func accept(with serverTrust: SecTrust, _ completionHandler: ((URLSession.AuthChallengeDisposition, URLCredential?) -> Void)) {
        completionHandler(.useCredential, URLCredential(trust: serverTrust))
    }

}

Почему ошибкив последних двух запросах?

При отправке электронной почты с использованием SendGrid API почта не отправляется, так как закрепление SSL не выполняется.Я не уверен, где я иду не так.Если я не пойду на SSL Pinning, все будет работать как положено.Кто-нибудь сталкивался с такой же проблемой раньше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...