Я создал API отдыха Java с использованием встроенного сервера Jetty и включил аутентификацию клиента.В аутентификации клиента я получаю CN сертификата клиента и проверяю, разрешен ли он.Я создал класс Filter для обработки логики аутентификации клиента.Однако, когда происходит сбой аутентификации клиента и возвращается фильтр, ответ не отправляется обратно, и в браузере появляется пустой экран, с которого был запущен API.В идеале он должен ответить с некоторой ошибкой.Я запускаю API из браузера, в котором я уже добавил действительные клиентские сертификаты
В объекте ответа фильтра я уже добавил статус возврата в ответ и некоторые другие вещи, чтобы он завершил запрос, ноэто не сработало.
Enabling client auth which configuring SslContextFactory:
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStore(keyStore);
sslContextFactory.setKeyStorePassword("changeit");
sslContextFactory.setKeyManagerPassword("changeit");
sslContextFactory.setCertAlias("selfsignlatest");
sslContextFactory.setNeedClientAuth(true);
sslContextFactory.setTrustStore(keyStore);
sslContextFactory.setTrustStorePassword("changeit");
Filter class doFilter method:
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
logger.debug("Filtering incoming request....");
boolean isValid = false;
HttpServletRequest httpreq = (HttpServletRequest) request;
HttpServletResponse httpresp = (HttpServletResponse) response;
X509Certificate[] certificates = (X509Certificate[]) httpreq.getAttribute("javax.servlet.request.X509Certificate");
if(certificates!=null && certificates.length>0) {
for(X509Certificate cert: certificates) {
commanName = getCNfromDomainName(cert.getSubjectX500Principal().getName());
if(commanName!=null && commanName.equals("clientjetty")) {
isValid = true;
break;
}
}
}
if(isValid) {
chain.doFilter(request, response);
}else {
httpresp.reset();
httpresp.setHeader("Connection", "close");
httpresp.setStatus(HttpStatus.SC_UNAUTHORIZED);
httpresp.flushBuffer();
httpresp.sendError(-1);
return;
}
}