码头 9.4 SSLContextFactory 中缺少 checkKeyStore()

missing checkKeyStore() in jetty 9.4 SSLContextFactory

我正在从 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");
        }
    }

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 年 4 月被删除,当时 Jetty 9.3.0 引入了对 SNI 的支持,引入了具有 SslContextFactory 实现层次结构的能力。

checkKeyStore() 提供的行为已移至 loadKeyStore() 方法,该方法始终在 SslContextFactorydoStart() 期间调用。

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

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

注意:对于 WebAppContext,请特别确保设置 setThrowUnavailableOnStartupException(true) 以允许它在整个生命周期内报告故障。