Роль 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)
, чтобы он мог сообщать о сбоях доЖизненный цикл.