2015-07-21 9 views
1

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

В итоге, моя цель состоит в том, чтобы разрешить доступ к веб-сайту, если пользователь уже аутентифицирован с ККА или требуют стандартного входа (имя/пароль), если пользователь не ККА подлинности

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

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

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

+0

Это не Vaadin конкретно, это просто контейнер сервлетов. Вам нужно будет проверить, действительно ли браузер отправил с ним сертификат клиента, и если он действителен –

+0

Хорошо, мне просто нужно знать, как выполнить этот процесс проверки, отправил ли браузер сертификат клиента из сервлета. Затем я удалю тег Ваадина. – djeison

+0

Какой контейнер сервлетов вы используете? –

ответ

2

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

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()); 
     } 
    } 
} 
+0

Я пробовал это, но 'cipherSuite' всегда null. Карточка CAC, которую я использую для этого теста, подключена и указана в моих сертификатах. Должен ли я сначала настроить Jetty? – djeison

+0

Выполняет ли ваш причал сертификат клиента вообще? Если нет, то нет никаких шансов, что клиент отправит вам один –

+0

Нет, это не так. Я не настроил SSL на своем Jetty. У вас есть информация о том, как это сделать? – djeison