Очистить состояние SSL на стороне клиента при выходе из системы (используя двусторонний SSL)

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

Я поставил ссылку «Выйти» на главном шаблоне. Цель этого состоит в том, чтобы аннулировать / очистить все и перенаправить их на незащищенную страницу с надписью «Вы вышли из системы». с кнопкой «Войти», которая перенаправит их обратно на страницу входа.

Страница входа в систему должна запросить у пользователя сертификат (и это происходит в первый раз). Но когда вы нажимаете кнопку «Войти» на странице «Выйти», она использует состояние SSL от предыдущего пользователя, и запрос сертификата не происходит.

Что мне действительно нужно, так это метод выхода из системы (предпочтительно не использовать сценарий Java), который очистит весь кэш, сделает недействительными все объекты сеанса и очистит состояние SSL.

Вот что я сделал до сих пор:

1.) Установите ограничение безопасности в web.xml, которое заставляет любой шаблон соответствия страниц '/ secure / *' быть доступным только через https. Это работает отлично ...

2.) Создан фильтр, который предотвращает кеширование ...

3.) Создана функция для выхода ...

Любая помощь будет очень признательна!

Код фильтра:

@WebFilter("/secure/*")
public class NoCacheFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate");
        httpResponse.setHeader("Pragma", "no-cache");
        httpResponse.setDateHeader("Expires", 0L); // Proxies.
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {}
}

Функция выхода

public void signOut() {
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();

    // Log Out of the Session
    request.logout();

    // Invalidate the Session objects
    externalContext.invalidateSession();
    if (externalContext.getRequestCookieMap().get(OPEN_TOKEN_COOKIE) != null) {
        externalContext.addResponseCookie(OPEN_TOKEN_COOKIE,null,Collections.<String, Object>singletonMap("maxAge", 0));
    }

    // Redirect to the Sign out page
    String signOutURL = MessageFormat.format("http://{0}{1}/{2}",externalContext.getRequestServerName(),externalContext.getRequestContextPath(),"goodbye.jsf");
    externalContext.redirect(signOutURL);
}

---------------------- Редактировать ----------------------

Я знаю, что заявил, что предпочел бы не использовать JavaScript, но пока не найду лучшего решения и не поделюсь с вами, как поделюсь с вами.

Я использую кнопку PrimeFaces с действием, указывающим на ссылки функции signOut ранее. Параметр oncomplete указывает на JavaScript, который очищает состояние SSL для Internet Explorer и Firefox (другие еще не пробовали).

Кнопка выхода

<p:commandButton value="Sign out" action="#{adminNavigationBean.signOut}" oncomplete="clearSSLState();" styleClass="commandButton"/>

JavaScript clearSSLState ()

<script type="text/javascript">
    function clearSSLState() {
        document.execCommand("ClearAuthenticationCache");
        window.crypto.logout();
    }
</script>

Важно отметить, что моя страница goodbye.xhtml НЕ находится в моей папке / secure /. Если это так, пользователю будет сразу предложено выбрать сертификат. Это вызвано ограничением безопасности в web.xml и является правильным поведением.

ограничение безопасности web.xml

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Protected Context</web-resource-name>
        <url-pattern>/secure/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Надеюсь, что это помогает другим.

Ответы на вопрос(0)

Ваш ответ на вопрос