У меня есть приложение для 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, все будет работать как положено.Кто-нибудь сталкивался с такой же проблемой раньше?