Аутентификация Common Access Card (CAC) с использованием приложения Vaadin

Я создаю веб-приложение Vaadin, которое требует от пользователей аутентификации с помощью логина и пароля, я хотел бы знать, можно ли добавить аутентификацию CAC в качестве другого средства аутентификации.

Подводя итог, моя цель — разрешить доступ к веб-сайту, если пользователь уже прошел проверку подлинности с помощью CAC, или потребовать стандартного входа (имя/пароль), если пользователь не прошел проверку подлинности CAC.

Путем поиска и поиска в Google я нашел Java PKCS #11, но похоже, что это библиотека для интеграции с рабочим столом.

Также я видел это и эти сообщения, похожие на мои ситуации, но на самом деле это не так. В первом говорится о необходимости сертификации всего веб-приложения путем настройки веб-сервера. Второй представляет Java PKCS#11 как настольное решение.

Опять же, я хочу иметь «параллельный» вход в систему, если браузер отправляет сертификат CAC на сервер, сервер не должен требовать стандартного входа в систему, в противном случае да. Является ли это возможным? Кроме того, если сертификат CAC отправляется на сервер, есть ли способ получить данные об этом CAC, например имя владельца?


person djeison    schedule 21.07.2015    source источник
comment
Это не специфично для vaadin, это просто контейнер сервлетов. Вам нужно будет проверить, отправил ли браузер вместе с ним сертификат клиента и действителен ли он.   -  person André Schild    schedule 21.07.2015
comment
Хорошо, мне просто нужно знать, как выполнить этот процесс проверки, отправил ли браузер сертификат клиента из сервлета. Тогда я удалю тег Vaadin.   -  person djeison    schedule 22.07.2015
comment
Какой контейнер сервлета вы используете?   -  person André Schild    schedule 22.07.2015
comment
Я использую Eclipse Jetty   -  person djeison    schedule 22.07.2015


Ответы (1)


В правильно настроенном контейнере сервлета вы можете использовать это для чтения сертификата клиента (если он существует)

String cipherSuite = (String) req.getAttribute("javax.servlet.request.cipher_suite");

if (cipherSuite != null) {
    X509Certificate certChain[] = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
    if (certChain != null) {
        for (int i = 0; i < certChain.length; i++) {
            System.out.println ("Client Certificate [" + i + "] = "
                    + certChain[i].toString());
        }
    }
}
person André Schild    schedule 22.07.2015
comment
Я пробовал это, но cipherSuite всегда равно нулю. Карта CAC, которую я использую для этого теста, подключена и указана в списке моих сертификатов. Должен ли я сначала настроить Jetty? - person djeison; 23.07.2015
comment
Ваш причал вообще запрашивает сертификат клиента? Если нет, то нет шансов, что клиент отправит вам один - person André Schild; 23.07.2015
comment
Нет, это не так. Я не настроил SSL на своем Jetty. У вас есть информация о том, как это сделать? - person djeison; 23.07.2015
comment
Ваш причал принимает https-соединение, или у вас есть сервер apache/nginx или другой перед ним? - person André Schild; 23.07.2015
comment
Jetty - это тот, который будет принимать соединение https. Я просмотрел eclipse.org/jetty/documentation/9.2.6.v20141205/, но я не смог узнать, как настроить его для запроса аутентификации CAC. - person djeison; 23.07.2015
comment
Посмотрите здесь stackoverflow.com/questions/752890/ и stackoverflow.com/questions/544056/ это должно решить вашу проблему - person André Schild; 23.07.2015
comment
Хорошо, но этот вопрос касается реализации клиента Java, который подключается к веб-приложению HTTPS. Мне нужно настроить SSL в моем веб-приложении, чтобы клиент отправлял сертификат в запросе, а затем я мог проверить, содержит ли этот запрос сертификат CAC. Если это так, пользователю не нужно использовать логин/пароль для входа в веб-приложение. Имеет ли это смысл? - person djeison; 24.07.2015
comment
Очень легко настроить встроенный сервер Jetty, который запрашивает аутентификацию клиента: нужно просто добавить оператор SslContextFactory.setNeedClientAuth(true); в контекст ssl при настройке сервера. Любой клиент, имеющий сертификат в хранилище доверенных сертификатов сервера, сможет установить TLS-соединение с сервером. Но слабым местом будет наличие правильных ключей в доверенном хранилище... - person André Schild; 24.07.2015
comment
У вас есть пример того, как добавить SslContextFactory.setNeedClientAuth(true); в контекст ssl? - person djeison; 24.07.2015