Сценарий: мы проводим в нашем классе несколько экспериментов с надежными соединениями и SSL, и я хочу продемонстрировать запрос подтверждения SSL при атаке «человек посередине».
У меня есть сервер Apache с самозаверяющим сертификатом. Все работает нормально, но ведение журнала кажется неполным, так как нет возможности получить список попыток SSL. Как только клиент принимает «исключение», я получаю обычные сообщения журнала доступа для каждого запроса. Однако мне нужно знать, какой запрос ssl привел к сбою. Вот мои директивы журнала:
LogLevel warn ErrorLog logs / ssl_error_log CustomLog logs / ssl_access_log комбинированный # комбинированный - ваш средний пользовательский журнал
Мое желание - это список всех попыток рукопожатия SSL. Что мне не хватает, что могло бы дать что-то вроде следующего? (Очевидно, точные слова не нужны, но приблизительно)
0/0/0 00:00:00 - 192.168.1.10 - hijk.lmnop.edu - Несоответствие SSL
SSL-соединения имеют дополнительные параметры для CustomLog но они не собираются нарушать пошаговый статус подключения. Вы, вероятно, захотите попробовать LogLevel debug
, но это даст вам много лишнего мусора, через который нужно продираться.
Честно говоря, лучшей идеей для этого класса было бы продемонстрировать использование openssl s_server
, так как ее можно настроить для пошагового отображения состояния конечного автомата SSL, вы сможете точно увидеть, на каком этапе клиент разорвал соединение.
Что-то вроде
openssl s_server -key [somekey.pem] -cert [somecert.pem] -accept 443 -state -www
Когда кто-то подключится, он распечатает шаги подключения:
SSL_accept:before/accept initialization
SSL_accept:SSLv3 read client hello A
SSL_accept:SSLv3 write server hello A
SSL_accept:SSLv3 write certificate A
SSL_accept:SSLv3 write key exchange A
SSL_accept:SSLv3 write server done A
SSL_accept:SSLv3 flush data
SSL_accept:SSLv3 read client key exchange A
SSL_accept:SSLv3 read finished A
SSL_accept:SSLv3 write change cipher spec A
SSL_accept:SSLv3 write finished A
SSL_accept:SSLv3 flush data
Параметр -www позволяет распечатать некоторую информацию, когда кто-то действительно подключается к нему с помощью веб-браузера. Если пользователь уйдет, не приняв поддельный сертификат, я предполагаю, что соединение будет прервано где-то посередине.
Вы можете использовать openssl s_client
команда аналогичным образом, хотя я не уверен, насколько гибко она может принимать или не принимать недействительные сертификаты.
Согласование сертификата происходит между вашим браузером и прокси-сервером, который выполняет атаку «человек посередине». На стороне сервера единственное различие, которое вы можете увидеть, - это IP-адрес клиента.
Однако на сервере вы можете настроить сертификаты клиентов для аутентификации клиентов. Сервер будет принимать соединения только от доверенных клиентов. Если соединение подделано, сертификат клиента будет другим, и сервер закроет соединение.