отсутствует checkKeyStore () в пристани 9.4 SSLContextFactory - PullRequest
0 голосов
/ 13 мая 2019

Я мигрирую с Jetty 9.0 на 9.4 По-видимому, следующий метод из SSLContextFactory удален из 9.3.0

public void checkKeyStore()

Я проверил документацию API, но не получиллюбая замена для этого не устарела в 9.2.x и была удалена непосредственно в 9.3.0.Я не эксперт по безопасности, но вот мой код, и я не совсем уверен, как мне обойти это в 9.4.x

private void configureHttps(Server server, int httpsPort, JettyAppConfig config, HttpConfiguration httpConfig)
            throws Exception {

        boolean shouldStartHttpsPort = false;

        SslContextFactory sslContextFactory = createJettySslContextFactory();

        if (sslContextFactory != null) {

            shouldStartHttpsPort = true;

            try {
                sslContextFactory.checkKeyStore(); //NEED REPLACEMENT in 9.4
            } catch (IllegalStateException e) {
                logger.debug("keystore check failed", e);
                shouldStartHttpsPort = false;
            }
        }

        if (shouldStartHttpsPort) {

            HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
            httpsConfig.addCustomizer(new SecureRequestCustomizer());

            ServerConnector httpsConnector = new ServerConnector(server,
                    new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
                    new HttpConnectionFactory(httpsConfig));
            httpsConnector.setPort(httpsPort);
            httpsConnector.setIdleTimeout(config.getConnectionIdleTimeout());

            server.addConnector(httpsConnector);

        } else {
            logger.info("Keystore not configured, not starting HTTPS");
        }
    }

1 Ответ

1 голос
/ 13 мая 2019

Роль checkKeyStore() в Jetty 9.0.0 - 9.2.0 состояла только в попытке загрузить хранилище ключей с диска, вот и все.Любое другое влияние на SslContextFactory будет считаться ошибкой.

Вот альтернативная реализация для вас.

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.eclipse.jetty.util.IO;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.ssl.SslContextFactory;

private static void check(SslContextFactory ssl) throws IOException
{
    if (ssl.getKeyStore() == null) // too late, already loaded?
    {
        if (StringUtil.isNotBlank(ssl.getKeyStorePath())) // no path, no check
        {
            Path keystorePath = Paths.get(ssl.getKeyStorePath());
            try (InputStream inputStream = Files.newInputStream(keystorePath);
                 OutputStream outputStream = new ByteArrayOutputStream())
            {
                IO.copy(inputStream, outputStream);
            }
        }
    }
}

Метод checkKeyStore() был удален в апреле 2015 года, когда была поддержана поддержка SNI.представленный в Jetty 9.3.0, в котором появилась возможность иметь иерархии SslContextFactory реализаций.

Поведение, предоставляемое checkKeyStore(), вместо этого было перемещено в метод loadKeyStore(), который всегда вызывается во время doStart() из SslContextFactory.

Короче говоря, в Jetty 9.0.0 checkKeyStore() всегда выполнялся, а теперь в Jetty 9.4.18 его поведение всегда работает, но в другом месте.Новое поведение также проверяет TrustStore, настройку SNI, выбор наборов шифров, выбор протоколов и т. Д. Новые методы делают намного больше, чем старый.

Поскольку вы используете embedded-jetty, рассмотрите вместо этогопроверки SslContextFactory, просто дайте жизненному циклу завершиться с ошибкой при вызове server.start().

Примечание. Для WebAppContext специально убедитесь, что вы установили setThrowUnavailableOnStartupException(true), чтобы он мог сообщать о сбоях доЖизненный цикл.

...