Отсутствует фабрика протоколов для следующего протокола SSL: «HTTP / 1.1» в ServerConnector - PullRequest
0 голосов
/ 21 октября 2018

При создании Jetty ServerConnector следующим образом:

Server server = new Server();
SslContextFactory sslContextFactory = new SslContextFactory();

ServerConnector sslConnector = new ServerConnector(server,
    new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()));

Я получаю следующую ошибку при запуске сервера:

java.lang.IllegalStateException: No protocol factory for SSL next protocol: 'HTTP/1.1' in ServerConnector@37918c79{SSL,[ssl]}{0.0.0.0:7443}
    at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:278)
    at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81)
    at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:235)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    at org.eclipse.jetty.server.Server.doStart(Server.java:395)
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
    [...]

1 Ответ

0 голосов
/ 22 октября 2018

Вам не хватает части HTTP соединения, которая составляет SSL + HTTP (он же HTTPS).

Совет. Если вы не видите, что HttpConfiguration или HttpConnectionFactory передаетсяв ваш ServerConnector, то вы не используете этот ServerConnector для HTTP.(что было бы в случае прокси, UnixSocket, JNI-разъемов, пользовательских разъемов и т. д.)

Типичная настройка будет ...

    int httpsPort = 8443;

    HttpConfiguration http_config = new HttpConfiguration();
    http_config.setSecureScheme("https");
    http_config.setSecurePort(httpsPort);

    // TODO: Setup non-SSL/TLS Connector/Port here (using http_config) and
    // set it to auto-redirect to SSL/TLS port.

    // SSL Context Factory
    SslContextFactory sslContextFactory = new SslContextFactory();
    sslContextFactory.setKeyStorePath("/path/to/keystore");
    sslContextFactory.setKeyStorePassword(...);
    sslContextFactory.setKeyManagerPassword(...);
    sslContextFactory.setTrustStorePath("/path/to/keystore");
    sslContextFactory.setTrustStorePassword(...);

    // SSL HTTP Configuration
    HttpConfiguration https_config = new HttpConfiguration(http_config);
    https_config.addCustomizer(new SecureRequestCustomizer()); // so that servlets can see the
                                                               // encryption details

    // SSL Connector
    ServerConnector sslConnector = new ServerConnector(server,
        new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()),
        new HttpConnectionFactory(https_config)); // <-- the argument you were missing
    sslConnector.setPort(httpsPort);
    server.addConnector(sslConnector);
...