security - 码头 9.4 SSLContextFactory 中缺少 checkKeyStore()
问题描述
我正在从 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");
}
}
解决方案
在 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)
为允许它在整个生命周期内报告故障。