java jersey grizzly http2 npn

Servidor embebido Java usando Grizzly: ¿Cómo habilitas http2



jersey npn (1)

Encontré cuál era el problema. Se explica aquí: http://unrestful.io/2015/10/09/alpn-java.html

Java 8 no es compatible con ALPN. grizzly-npm-bootstrap está ahí para anular las clases de sistema para proporcionar esa compatibilidad. Como tal, se debe agregar a Xbootclasspath de la siguiente manera:

java -Xbootclasspath/p:/path/to/grizzly-npn-bootstrap.jar

Y dado que anula las clases del sistema, debe adaptarse a las nuevas versiones del JRE. Como uso Java 8 y grizzly-npn-bootstrap.jar solo está disponible para OpenJDK 7, no tengo suerte.

Una opción es cambiar a Jetty, que proporciona alpn-boot para la mayoría de las versiones (todas?) De OpenJDK.

Así que estoy tratando de crear un servidor REST API utilizando Grizzly / Jersey y está funcionando bien, pero no puedo averiguar cómo habilitar http2. La documentación sobre este tema es casi inexistente. Esto es lo que tengo:

private static SSLContext getSSLContext(final String keystore) throws Exception { SSLContext sslContext = SSLContext.getInstance("TLSv1"); final char[] passphrase = "changeit".toCharArray(); final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); final KeyStore ks = KeyStore.getInstance("JKS"); try (InputStream stream = Main.class.getResourceAsStream(keystore)) { ks.load(stream, passphrase); } kmf.init(ks, passphrase); sslContext.init(kmf.getKeyManagers(), null, null); return sslContext; } final ResourceConfig rc = new ResourceConfig().packages("path.to.package"); final HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri, rc, false); final NetworkListener listener = server.getListeners().iterator().next(); listener.registerAddOn(new Http2AddOn()); listener.setSecure(true); final SSLEngineConfigurator configurator = new SSLEngineConfigurator( getSSLContext("keystore.jks"), false, false, false ); listener.setSSLEngineConfig(configurator);

Y, hasta donde yo sé, tengo todas las dependencias apropiadas en mi archivo pom.xml:

<dependency> <groupId>org.glassfish.grizzly</groupId> <artifactId>grizzly-http2</artifactId> <version>2.3.24</version> </dependency> <dependency> <groupId>org.glassfish.grizzly</groupId> <artifactId>grizzly-npn-bootstrap</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.glassfish.grizzly</groupId> <artifactId>grizzly-npn-api</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-grizzly2-http</artifactId> </dependency>

Cuando pruebo el servidor con curl -v --http2 ..., obtengo

  • ...
  • ALPN / NPN, el servidor no aceptó un protocolo
  • Conexión SSL usando TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • ...

¿Alguien sabe lo que falta?