Безопасность · 6 min read · Jan 06, 2026
Предотвращение фишинга с помощью взаимной аутентификации
Prevent Phishing with Mutual Authentication
Фишинг — это по сути атака «человек посередине». Пользователь направляется на мошеннический сайт, например, с помощью социальной инженерии или отравления DNS-кэша. Поскольку пользователь не понимает, как проверять SSL-сертификаты (а кто это понимает?), этот трюк срабатывает слишком часто. Такие усилия, как сертификаты с расширенной проверкой, обречены на провал во многих случаях, потому что они полагаются на непоследовательные визуальные подсказки, а не на сильную криптографию. Одноразовые пароли также оказались уязвимыми для атак MITM в реальном времени. Для постоянного предотвращения фишинга требуется сильная взаимная аутентификация — проверка хоста для пользователя и пользователя для хоста.
В этом документе мы настроим приложение JSP для работы с открытой системой одноразовых паролей и взаимной аутентификации WiKID. Вот как это будет работать: когда пользователь хочет войти на целевой сайт, он запускает клиент токена WiKID и вводит свой PIN-код. PIN-код шифруется открытым ключом сервера и отправляется на сервер. Если PIN-код правильный, шифрование действительное, а учетная запись активна, пакет OTP, URL целевого сайта и хэш SSL-сертификата целевого сайта отправляются клиенту токена. Клиент токена выходит через интернет-соединение пользователя на URL целевого сайта, получает SSL-сертификат, хэширует его и сравнивает с проверенным хэшом сертификата. Если два хэша совпадают, клиент токена представляет OTP и (на поддерживаемых платформах) запускает браузер по умолчанию на сайт для пользователя.
Сначала мы добавим домен на сервере WiKID для приложения, затем создадим сетевой клиент для страницы JSP. Мы добавим код входа для WiKID на страницу JSP, а затем протестируем его с клиента токена.
Добавление домена на сервер WiKID
Это довольно просто. В веб-интерфейсе администрирования сервера WiKID нажмите на вкладку Domains и Create New Domain. Введите имя домена для шлюза и имя устройства. Имя устройства будет отображаться на токене WiKID. В поле Registered URL укажите URL страницы JSP для целевого сервера. Когда домен будет создан, сервер WiKID получит сертификат с веб-сервера, поэтому убедитесь, что вы ввели ‘https:’. Код сервера будет маршрутизируемым, с нулями перед числом IP-адреса сервера WiKID (например, 10.1.1.1 = 010001001001). Установите другие параметры по своему усмотрению. Хотя более длинный PIN может математически увеличить безопасность, четырехзначный PIN может быть лучше: если пользователь использует свой PIN-код для банкомата, он с большей вероятностью защитит его.

Создание сетевого клиента
После сохранения информации о домене нажмите на вкладку Network Client и Create New Network Client. Введите имя для этого клиента и IP-адрес целевого сервера во внутренней сети. Выберите wAuth в качестве протокола, а затем выберите домен, который вы создали выше.

Нажмите Add, чтобы перейти на следующую страницу, и введите информацию для p12 сертификата для целевого сервера. Связь между сервером JSP и сервером WiKID будет зашифрована с помощью SSL, используя этот p12 файл. Введите пароль для этого p12 файла дважды и пароль, который вы использовали для сертификата сервера во время процесса настройки. Когда вы вернетесь на страницу Network Client, вы увидите новый сетевой клиент в списке и ссылку для загрузки p12 файла. Скачайте p12 файл и поместите его на ваш сервер JSP в тот же каталог, что и ваш код JSP.

Настройка ваших страниц JSP
На вашем сервере JSP вам нужен p12 файл, созданный на сервере WiKID, файл java-клиента WiKID (Wikid.jar), который доступен на нашем сайте или на нашем сайте Sourceforge, и ваша страница JSP. Кроме того, вам нужно использовать Java версии 1.4.2_06 или новее. Каждый пакет сетевого клиента включает пример страницы. Здесь мы будем редактировать страницу example.jsp. Эта страница также включает код для программного добавления новых пользователей.
Откройте вашу страницу JSP в вашем любимом редакторе:
Сначала импортируйте клиент WiKID:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="com.wikidsystems.client.*" %> Этот раздел создает соединение между приложением сетевого клиента и сервером WiKID. Для успешного выполнения этого действия сетевой клиент должен иметь сертификат, выданный сервером WiKID. Сертификат содержится в хранилище сертификатов PKCS12 и требует пароль для доступа. caStore — это Java Keystore, который содержит сертификаты серверов WiKID, с которыми вы будете подключаться с помощью этого клиента. Вы можете скопировать это из WAS как /opt/WiKID/private/CACertStore. caStorePass — это пароль для открытия caStore.
Когда объект wClient создается, он загружает сертификат и устанавливает постоянное аутентифицированное SSL-соединение. Обычно это делается один раз на сервер или приложение и используется несколькими потоками. В этом примере объект создается и уничтожается при каждом запросе страницы. Это значительно (в 1000 раз) увеличивает накладные расходы процесса, но позволяет показать все функции на этой единственной странице примера.
Параметры:
- wClient(String host, int port, String keyfile, String pass)
- host = IP-адрес сервера WIKID
- port = номер TCP порта для подключения (по умолчанию 8388)
- keyfile = путь к файлу сертификата PKCS12
- pass = пароль для открытия файла PKCS12
- caStore - хранилище сертификатов для проверки сертификата сервера WAS, загрузите это с сервера WiKID (opt/WiKID/private/CACertStore <– НЕ ИСПОЛЬЗУЙТЕ файл cacerts Java
- caStorePass - пароль, защищающий файл caStore
<% String status="";
String chall="";
wClient wc = new wClient("192.168.0.1",
8388,
"/opt/tomcat/webapps/example/Token_test_client.p12",
"yourpassphrase",
"/opt/tomcat/webapps/example/CACertStore",
"yourpassphrase");
%> Вход в систему онлайн
Эта функция — это обычный вход в систему для пользователей. Она вызывается, когда устройство пользователей подключено к сети и может напрямую запросить код доступа.
Параметры:
- CheckCredentials(String user, String passcode, String servercode)
- user = идентификатор пользователя для проверки учетных данных
- passcode = временной, одноразовый код доступа
- servercode = 12-значный код, созданный на сервере WiKID, в данном случае 333344445555
Этот метод возвращает логическое значение, представляющее успешную или неуспешную аутентификацию
<%
boolean isValid = false;
if(request.getParameter("action") != null && request.getParameter("action").equalsIgnoreCase("Check Online")){
isValid = wc.CheckCredentials(request.getParameter("user"), request.getParameter("passcode"), request.getParameter("servercode"));
if (isValid){
status="Успех";
} else {
status="Ошибка аутентификации";
}
}
%> А вот HTML для формы:
Онлайн вход:
Тестирование с клиентом токена
Если вы еще не сделали этого, вы можете скачать копию открытого клиентского токена WiKID. Запустите токен с помощью ‘run.sh’ или ‘run.bat’ в зависимости от вашей платформы. В первый раз, когда вы запускаете клиент токена, вам нужно создать пароль. После запуска выберите Actions и Create New Domain

Введите 12-значный идентификатор домена, и открытый ключ будет отправлен на сервер WiKID. Вам будет предложено ввести PIN-код.

Сервер WiKID сохранит PIN-код и вернет код регистрации.

На этом этапе учетная запись была создана на сервере WiKID, но она не активна. Вы можете создать страницы самообслуживания для регистрации пользователей на основе существующих доверенных учетных данных или механизмов вне границ, но в данном случае мы вручную проверим пользователя на сервере WiKID. В веб-интерфейсе WiKIDAdmin нажмите на Users и Manually Validate A User. Нажмите на код регистрации и введите имя пользователя.

Теперь, с клиента токена, выберите домен, который вы создали, и введите свой PIN-код. Вы должны получить одноразовый код доступа (и он должен быть скопирован в ваш буфер обмена), и ваш браузер должен запуститься на зарегистрированном URL.
Объединив одноразовые коды доступа для аутентификации пользователей с встроенной проверкой сертификата хоста и автоматическим запуском браузера, мы создали систему, которая проста для пользователя, но криптографически надежна. Клиент токена способен обрабатывать несколько доменных отношений без снижения безопасности благодаря использованию криптографии с открытым ключом, а сервер способен управлять несколькими отношениями сетевых клиентов. Дополнительные примеры сетевых клиентов доступны для Ruby, PHP, Python и ASP/COM/.NET. Apache или IIS также могут быть настроены с использованием Radius или LDAP.
Вы можете протестировать этот процесс (анонимно) на http://www.wikidsystems.com/signup/example.jsp
Get new posts in your inbox
No spam. Unsubscribe anytime.