首页 > 解决方案 > 码头 9.4 SSLContextFactory 中缺少 checkKeyStore()

问题描述

我正在从 Jetty 迁移9.09.4 显然,SSLContextFactory 中的以下方法已从9.3.0

public void checkKeyStore()

我检查了 api 文档,但没有得到任何替代品,也没有9.2.x9.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");
        }
    }

标签: securityjettyembedded-jettyjetty-9

解决方案


在 Jetty 9.0.0 到 9.2.0 中的作用checkKeyStore()只是尝试从磁盘加载密钥库,仅此而已。任何其他影响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 年 4 月,当 Jetty 9.3.0 中引入了对 SNI 的支持时,该方法被删除,它引入了SslContextFactory实现层次结构的能力。

提供的行为checkKeyStore()被移到loadKeyStore()方法中,该方法总是doStart()SslContextFactory.

简而言之,在 Jetty 9.0.0 中checkKeyStore()总是运行,而现在在 Jetty 9.4.18 中,它的行为总是在运行,但在不同的地方。新行为还会检查 TrustStore、SNI 设置、密码套件选择、协议选择等。新技术比旧技术做得更多。

由于您正在使用embedded-jetty,请考虑不要检查SslContextFactory,而只是让生命周期在server.start()调用中失败。

注意:WebAppContext特别要确保您设置setThrowUnavailableOnStartupException(true)为允许它在整个生命周期内报告故障。


推荐阅读