0

我想在我的 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的类路径中有。

4

0 回答 0