gRPC + SSL = UnsatisfiedLinkError

gRPC + SSL = UnsatisfiedLinkError

我一直在尝试对我的 gRPC 服务进行 SSL 验证(在明文模式下工作正常)。注意:这是在商业环境中限制了我的一些选择(例如开发环境和部署平台)。

我跟着 SECURITY.md which recommends using OpenSSL ... and therefore netty-tcnative ... which leads to Forked Tomcat Native 和一些选择:

  1. netty-tcnative-{arch} - 动态链接,要求目标系统上已安装 APR 和 OpenSSL
  2. netty-tcnative-boringssl-static-{os_arch} - 静态链接到 APR 和 google 的 OpenSSL 分支
  3. netty-tcnative-boringssl-static - 静态链接 uber jar 与通用平台的本地库
  4. netty-tcnative-openssl-static-{os_arch} - 静态链接到 APR 和 OpenSSL ...但不在 Maven Central 所以不是我的第一选择

#3

文档说#3 是最简单的工件。 但是,对我来说,这会导致找不到 netty-tcnative.dll(在这种情况下,它应该来自 jar AFAIK)。

#2

这看起来是下一个最简单的。 据说我可以使用 os-maven-plugin 在构建时找出用于这些需要一个版本的工件的分类器(即 2 和 4)。 虽然它正确地解决了它们(根据 mvn compile 输出),但我得到了不同的运行时行为:

#4

我想这可能有用。但它不在 Maven Central,所以不是我喜欢的路径。

#1

可能会奏效。但是意味着在我们部署的任何服务器上安装 APR 和 OpenSSL。对于我必须使用的内部 PaaS,我不喜欢这样的机会。暂时避免。

TLS 与 JDK

可能试试这个。 但是 the doc 强烈建议不要使用它,因为您必须 fiddle 使用 Java 的引导类路径(我可以想象这里有更多的 PaaS 障碍,也许是没有根据的...)。 而且它的性能显然并不过分(比 OpenSSL 慢 10 倍以上)。 而且它很脆弱(Jetty-ALPN 版本必须与正在使用的 JRE 完全对应,尽管听起来可能有解决方案)。

底线

如果我不能解决这个问题,它可能会为我的项目杀死 gRPC。这是否是一件坏事还有待商榷……与此同时,有没有人有任何想法或一个有效的 SSL 化 gRPC client/server 应用程序(grpc-java/examples 都只使用纯文本)。

这绝对是一个netty-tcnative bug。我刚刚创建了 https://github.com/netty/netty-tcnative/issues/141 并将考虑减少 MSVC 引入的依赖项列表。

现在,尝试自己构建 openssl[static/dynamic],看看是否适合你。