Как использовать jetty для установки двухстороннего соединения аутентификации SSL - PullRequest
0 голосов
/ 07 марта 2020

Я хочу создать сервлет с помощью двухстороннего ssl-коннектора. Я создал test2wayssl.jks и инициировал SslSelectChannelConnector Когда я отправляю запрос от почтальона с клиентским сертификатом , ответ в почтальоне равен

При подключении к 127.0.0.1:29226/2wayssl.

произошла ошибка. Вот мой код ниже. Но это не работает.

Server server = new Server(29226);

SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath("2-way-ssl-authentication/test2wayssl.jks");
sslContextFactory.setKeyStorePassword("123456"); 
sslContextFactory.setKeyManagerPassword("123456");
sslContextFactory.setTrustAll(true);

SslSelectChannelConnector sslConnector = new SslSelectChannelConnector(sslContextFactory);
sslConnector.setAllowRenegotiate(true); 
sslConnector.setHost("localhost");
sslConnector.setServer(server);      

server.addConnector(sslConnector);

ServletHandler handler = new ServletHandler();
handler.addServletWithMapping(HelloServlet.class, "/2wayssl");
server.setHandler(handler); 

try { 
  server.start(); 
} catch (Exception e) {
  e.printStackTrace();  // TODO impl
}

Ниже приведен мой класс сервлетов

  @SuppressWarnings("serial")
  public static class HelloServlet extends HttpServlet 
  {
    @Override
    protected void doPost(HttpServletRequest request,
                         HttpServletResponse response) throws IOException
    {
      response.setStatus(HttpServletResponse.SC_OK);
      response.setContentType("text/html");
      response.setCharacterEncoding("utf-8");
      response.getWriter().println("<h1>2 Way SSL Authentication</h1>");
    }
  }

Любая помощь приветствуется.

1 Ответ

1 голос
/ 09 марта 2020

SslSelectChannelConnector от Jetty 8 и старше , которые сейчас EOL / End of Life и не поддерживают клиентские сертификаты, сначала обновите до поддерживаемой и стабильной версии Jetty.

Как это сделать с Jetty 9.4.27.v20200227, используя SslContextFactory.Server и одну (или обе) опции

Пример:

Server server = new Server();
int httpsPort = 8443;

// Setup HTTP Connector
HttpConfiguration httpConf = new HttpConfiguration();
httpConf.setSecurePort(httpsPort);
httpConf.setSecureScheme("https");

// Setup SSL
SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStoreResource(findKeyStorePath());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setWantClientAuth(true); // Option 1
sslContextFactory.setNeedClientAuth(true); // Option 2

// Setup HTTPS Configuration
HttpConfiguration httpsConf = new HttpConfiguration();
httpsConf.setSecureScheme("https");
httpsConf.setSecurePort(httpsPort);
httpsConf.addCustomizer(new SecureRequestCustomizer()); // adds ssl info to request object

// Establish the HTTPS ServerConnector
ServerConnector httpsConnector = new ServerConnector(server,
    new SslConnectionFactory(sslContextFactory,"http/1.1"),
    new HttpConnectionFactory(httpsConf));
httpsConnector.setPort(httpsPort);

server.addConnector(httpsConnector);

// Add a Handlers for requests
HandlerList handlers = new HandlerList();
handlers.addHandler(new SecuredRedirectHandler());
handlers.addHandler(new HelloHandler("Hello Secure World"));
server.setHandler(handlers);

server.start();
server.join();
...