Ssl pinning в Swift AlamoFire
Я новичок здесь, но у меня есть приложение, которое подвержено атакам MITM.
После того, как я немного научился, мне кажется, что мне нужно сделать SSL Pining, т.е. сохранить копию открытого ключа/сертификата моих серверов, чтобы он мог определить, пришел ли от него ответ.
Я понятия не имею, как это сделать, я использую AlamoFire в Swift для работы с сетью.
Ответы
Ответ 1
В Alamofire теперь реализовано закрепление сертификата.
Необходимая документация находится в файле Readme.md
https://github.com/Alamofire/Alamofire
Посмотрите пример реализации:
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"test.example.com": .PinCertificates(
certificates: ServerTrustPolicy.certificatesInBundle(),
validateCertificateChain: true,
validateHost: true
),
"insecure.expired-apis.com": .DisableEvaluation
]
let manager = Manager(
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
Ответ 2
Во-первых, вам необходимо скачать сертификат. Лучший способ - скачать сертификат в браузере Firefox.
Шаг 1
Перейдите на свою веб-страницу/API и нажмите значок замка, чтобы получить сертификат.
![enter image description here]()
Шаг 2
Нажмите Просмотр сертификата
![enter image description here]()
Шаг 3
Выберите вкладку "Поля сертификата" в первом разделе и нажмите "Экспорт".
![enter image description here]()
Шаг 4
Выберите формат: - DER
![enter image description here]()
Шаг 5
Перетащите файл в ваш проект XCode
![enter image description here]()
Шаг 6
Добавить сертификат в "Цели> Фазы сборки> Копировать ресурсы комплекта"
![enter image description here]()
Шаг 7
Добавить файл сетевого менеджера. Замените свой URL на google.com.
import Foundation
import Alamofire
import SwiftyJSON
class MYPNetworkManager {
var Manager: SessionManager?
init() {
let serverTrustPolicies: [String: ServerTrustPolicy] = [
"https://google.com": .pinCertificates(
certificates: ServerTrustPolicy.certificates(),
validateCertificateChain: true,
validateHost: true
),
"insecure.expired-apis.com": .disableEvaluation
]
Manager = SessionManager(
serverTrustPolicyManager: ServerTrustPolicyManager(policies:
serverTrustPolicies)
)
}
}
Шаг 8
Добавьте файл, чтобы получить менеджер сессий
import Foundation
import Alamofire
import SwiftyJSON
class APIPinning {
private static let NetworkManager = MYPNetworkManager()
public static func getManager() -> SessionManager {
return NetworkManager.Manager!
}
}
Шаг 9
Используйте этот менеджер сессий на Alamofire, например: -
public static func testPinning() {
NetworkManager.Manager!.request("YourURL", method: .get, encoding: URLEncoding.httpBody, headers: MConnect.headersWithToken)
.validate()
.responseJSON { response in
print(response)
switch response.result {
case .success:
if let value = response.result.value {
let json = JSON(value)
print(json)
} else {
}
case .failure:
print("Error")
}
}
}
Ответ 3
Alamofire 5.0 теперь выпущен. И SSN Pinnig изменен. Посмотрите на фрагмент кода ниже.
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = timeoutIntervalForRequest
let trustManager = ServerTrustManager(evaluators: [
"prod.ehliyetcepte.com": PublicKeysTrustEvaluator(),
"dev.ehliyetcepte.com": DisabledEvaluator()])
self.session = Session(startRequestsImmediately: true,
configuration: configuration,
delegate: self,
serverTrustManager: trustManager)
Ответ 4
Как указано здесь: https://github.com/Alamofire/Alamofire/issues/366
Это, безусловно, то, что сообщество хочет поддержать, но пока нет надежных временных рамок. На данный момент я бы сказал, что вам нужно продолжить AFNetworking и внимательно следить за проектом Alamofire для новых функций.