Я хочу настроить SSL на моем сервере GRPC.
Вот что я делаю:
Server server = NettyServerBuilder.forPort(8080)
.useTransportSecurity(certChain, privateKey)
.addService(new HelloWorldService())
.build();
Теперь я получаю ClassnotFoundException:
Caused by: java.lang.ClassNotFoundException: org/eclipse/jetty/alpn/ALPN
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at io.grpc.netty.JettyTlsUtil.isJettyAlpnConfigured(JettyTlsUtil.java:34)
at io.grpc.netty.GrpcSslContexts.selectApplicationProtocolConfig(GrpcSslContexts.java:153)
... 5 more
Если мы рассмотрим метод JettyTlsUtil.isJettyAlpnConfigured () , мы увидим
Class.forName ("org.eclipse.jetty.alpn.ALPN", true, null);
Теперь у меня есть ALPN в моем классе. Также я настроил свои зависимости в соответствии с таблицей, представленной здесь https://github.com/grpc/grpc-java/blob/master/SECURITY.md#transport-security-tls
Люди из gRPC не рекомендуют использовать JDK в качестве SSLProvider. Поэтому я скачал io.netty.internal.tcnative.SSL , который является SSLProvider от OpenSSL.
Тем не менее, gRPC не распознает, что у меня есть OpenSSL здесь:
/**
* Returns OpenSSL if available, otherwise returns the JDK provider.
*/
private static SslProvider defaultSslProvider() {
return OpenSsl.isAvailable() ? SslProvider.OPENSSL : SslProvider.JDK;
}
EDIT:
Я смог заставить его работать, добавив аргумент VM -javaagent: C: /path/to/jetty-alpn-agent.jar
Это позволяет работать с JDK в качестве поставщика SSL. Я до сих пор не понимаю, почему grpc не распознает, что у меня есть OpenSSL. У меня есть netty-tcnative-boringssl-static
в моем классе.