我想在我的GRPC服务器上设置SSL。 这是我在做什么:
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 ,它是OpenSSL的SSLProvider。 但是,gRPC无法识别我在这里可用的OpenSSL:
/**
* Returns OpenSSL if available, otherwise returns the JDK provider.
*/
private static SslProvider defaultSslProvider() {
return OpenSsl.isAvailable() ? SslProvider.OPENSSL : SslProvider.JDK;
}
编辑: 我可以通过添加VM参数-javaagent:C:/path/to/jetty-alpn-agent.jar
来使其工作这使得它可以与JDK作为SSL提供程序一起使用。我仍然不明白为什么grpc无法识别我有可用的OpenSSL。我的班级路径中确实有netty-tcnative-boringssl-static
。