Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Как сделать HTTPS запрос с защитой от MITM?

#delphi_7 #https #openssl #сертификат


Нужен пример кода для скачивания странички или файла по https протоколу с проверкой
подлиности то есть, что бы в сессию нельзя было вклинится и подделать ответ. Все это
дело будет на делфи 7 но устроит и код на си можно использовать winapi (Win7+) и/или
openSSL dll'ку.
    


Ответы

Ответ 1



Достаточно будет сделать дополнительную проверку публичного ключа сервера. Смысл в том, чтобы клиент был вкурсе, что на стороне сервера нет чужака, т.к. задача MITM - подменить для клиента публичный ключ, которым клиент шифрует pre master secret. Если Вы заранее знаете приватный ключ сервера, то MITM Вам уже не страшен, т.к. вы можете легко проверить, соответствует ли Вашему, заранее известному, приватному ключу пришедший со стороны сервера публичный ключ. Это легко сделать, если взять произвольную строку, закодировать ее публичным ключом, и раскодировать приватным (заранее известным Вам). Если не получили исходную строку, то можете сигнализировать пользователю об атаке MITM и предпринимать соответствующие действия. Код не привожу, т.к. решение слишком специфично и требует на мой взгляд какой-то готовой инфраструктуры, которой у меня сейчас нет. Возможно позднее, когда будет на это время и возможности. Но если Вы предоставите свой код или API, который умеет у Вас мониторить SSL, в частности - пакет Server Certificate то минимальный алгоритм работы с OpenSSL я приведу. В большинстве случаев, приватный ключ Вам доступен не будет. Это логично, на то он и "приватный", чтобы гарантировать безопасность только диалога, а не всей цепочки посредников, так или иначе, вовлеченных в "беседу". Поэтому я приведу еще один оч. хороший вариант, т.н. - сertificate authority. В такой конфигурации, для проверки подлинности сертификата, владелец сервера выдает1 своим пользователям корневой сертификат (CA). Суть этой защиты в том, что любой сертификат сервера подписывается цифровой подписью, которая может быть проверена этим CA. Конечно, OpenSSL имеет и на такой случай API, но я пока не сталкивался с необходимостью такой проверки, поэтому пока не подскажу с кодом, но его можно легко нагуглить по ключевым словам openssl api verify ca. Более простой вариант - воспользоваться openssl напрямую: $ openssl verify -verbose -CAfile cacert.pem server.crt server.crt: OK но это потребует установленных бинарников openssl на стороне клиента. 1 Сертификат CA передается клиенту любым доступным способом, например: высылается по почте, или выкладывается в публичный доступ на сайте владельца, или устанавливается в хранилище сертификатов на стороне клиента через инсталятор - вариантов масса, главное - чтобы он был доступен клиенту в момент установки соединения с сервером. Поскольку ответ стал жертвой модераторского произвола, и все мои комментарии кто-то заботливо выпилил в чат, оставив только "правильные". привожу основные доводы в самом ответе: Этот изувеченный модератором мой второй ответ. Мой первый ответ был дан, чтобы объяснить, как приватный ключ защищает от MITM (и этот ответ модератор совершенно необдуманно слил со вторым). Мой второй ответ был дан чтобы показать способ, придуманный специально для предотвращаения MITM. Дискуссия по поводу неправильных действий модератора на мете. Дискуссия по аналогичному вопросу с общей меты (благодарю @Саша Черных за информацию) Надеюсь, здравый смысл участников сообщества победит неквалифицированное поведение администрации.

Комментариев нет:

Отправить комментарий