Ответ 1
Этот механизм называется SSL Pinning.
Теория:
Что такое Пиннинг? ,
Пиннинг - это необязательный механизм, который можно использовать для повышения безопасности службы или сайта, использующего SSL-сертификаты. Pinning позволяет указать криптографический идентификатор, который должен быть принят пользователями, посетившими ваш сайт.
Это звучит сложно, но на самом деле это довольно просто. Давайте начнем с разрушения:
Криптографическая идентификация - это файл, который может подтвердить идентификатор сервера/хоста посредством криптографии. Сертификат SSL, открытый ключ и CSR являются примерами криптографического идентификатора. Этот вывод затем сообщит клиенту, чтобы он помнил эту личность (или идентификаторы) и принимал их только при создании будущих безопасных подключений.
Итак, если вы хотите использовать пиннинг, вы должны настроить свой сервер (в некоторых ситуациях - подумайте о внутренних системах - вы также можете настроить клиентов) и укажите, что вы хотели бы установить. Браузеры и другие клиенты будут оценивать прикрепленный идентификатор для каждого соединения. Если какая-либо другая личность была представлена, клиент прекратил бы соединение (что произошло в вашем случае с Charles Proxy).
Чтобы подумать о большой картине: SSL-соединение говорит клиенту сделать зашифрованное соединение с любым идентификатором, соответствующим этому хосту. Привязка указывает клиенту конкретную идентификацию, которую они должны принимать при создании безопасного соединения.
Так, например, если наш сайт example.com, мы могли бы привязать идентификатор. Когда пользователь посещает наш сайт, они получат прикрепленную информацию. В будущем посещение их браузера будет действовать, если мы попытаемся заставить клиента использовать другую личность.
Практика:
Основной ключ SSL, закрепляющий этот сертификат сервера, будет сохранен в комплекте приложений. Затем, когда клиент получает сертификат с сервера, он затем сравнивает 2 сертификата, чтобы убедиться, что они совпадают до установления соединения.
Сетевая библиотека Alamofire HTTP имеет встроенную функцию для шифрования SSL и очень проста в использовании:
let pathToCert = Bundle.main.path(forResource: "name-of-cert-file", ofType: "cer")
let localCertificate: NSData = NSData(contentsOfFile: pathToCert!)!
let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
certificates: [SecCertificateCreateWithData(nil, localCertificate)!],
validateCertificateChain: true,
validateHost: true
)
let serverTrustPolicies = [
"my-server.com": serverTrustPolicy
]
let sessionManager = SessionManager(
serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
)
Вы можете узнать больше здесь и здесь о том, как достичь SSL-шифрования в вашем быстром приложении.