Как перечислить клиентские сертификаты на стороне сервера в джет-сервере - PullRequest
0 голосов
/ 05 сентября 2018

Я настроил сервер Jetty с контекстом ssl, обновленным ключами и хранилищами доверия, и, тем не менее, любой клиент, имеющий действительный сертификат, которому доверяет сервер, сможет установить TLS-соединение с сервером.

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

Я хочу выполнить некоторые пользовательские проверки сертификата для дальнейшей фильтрации клиентов на основе некоторых полей в сертификате их присутствия на сервере?

PS: Я действительно пробовал смотреть онлайн и немного исследовать, но, похоже, ничего не работает.

1 Ответ

0 голосов
/ 05 сентября 2018

Начните с добавления SecureRequestCustomizer к вашему HttpConfiguration, который ServerConnector использует.

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

Пример (от LikeJettyXml.java):

    // === jetty-http.xml ===
    ServerConnector http = new ServerConnector(server,
            new HttpConnectionFactory(http_config));
    http.setPort(8080);
    http.setIdleTimeout(30000);
    server.addConnector(http);


    // === jetty-https.xml ===
    // SSL Context Factory
    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.setKeyStorePath("config/etc/keystore");
    sslContextFactory.setKeyStorePassword(...);
    sslContextFactory.setKeyManagerPassword(...);
    sslContextFactory.setTrustStorePath("config/etc/keystore");
    sslContextFactory.setTrustStorePassword(..);

    // SSL HTTP Configuration
    HttpConfiguration https_config = new HttpConfiguration(http_config);
    https_config.addCustomizer(new SecureRequestCustomizer()); // <-- the magic line

    // SSL Connector
    ServerConnector sslConnector = new ServerConnector(server,
        new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
        new HttpConnectionFactory(https_config));
    sslConnector.setPort(8443);
    server.addConnector(sslConnector);

Как только это будет сделано, при обработке запроса вы сможете получить доступ к атрибутам запроса ...

  • request.getAttribute("javax.servlet.request.X509Certificate") - массив java.security.cert.X509Certificate, используемый в соединении
  • request.getAttribute("javax.servlet.request.cipher_suite") - имя согласованного набора шифров (тип String)
  • request.getAttribute("javax.servlet.request.key_size") - размер ключа (тип Integer)
  • request.getAttribute("javax.servlet.request.ssl_session_id") - идентификатор сеанса SSL (тип String)
  • request.getAttribute("org.eclipse.jetty.servlet.request.ssl_session") - активный javax.net.ssl.SSLSession используется соединением.

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

...