gRPC + SSL = UnsatisfiedLinkError
gRPC + SSL = UnsatisfiedLinkError
我一直在尝试对我的 gRPC 服务进行 SSL 验证(在明文模式下工作正常)。注意:这是在商业环境中限制了我的一些选择(例如开发环境和部署平台)。
我跟着 SECURITY.md which recommends using OpenSSL ... and therefore netty-tcnative ... which leads to Forked Tomcat Native 和一些选择:
netty-tcnative-{arch}
- 动态链接,要求目标系统上已安装 APR 和 OpenSSL
netty-tcnative-boringssl-static-{os_arch}
- 静态链接到 APR 和 google 的 OpenSSL 分支
netty-tcnative-boringssl-static
- 静态链接 uber jar 与通用平台的本地库
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
输出),但我得到了不同的运行时行为:
- 使用
<classifier>${os.detected.classifier}</classifier>
我得到 java.lang.ClassNotFoundException: org.apache.tomcat.jni.SSL
- 硬编码到
<classifier>windows-x86_64</classifier>
我更进一步但仍然没有雪茄:现在 netty-tcnative 不会加载:java.lang.UnsatisfiedLinkError: C:\Temp\netty-tcnative1392766600896877072.dll: Can't find dependent libraries
(一条不寻常的路径,因为 DLL 已从 jar 复制到我的临时目录和 System.load
从那里编辑)
- 根据dependency walker, that DLL has a whole stack of dependencies some of which really don't appear on my filesystem. But it seems that's because depends.exe hasn't kept up with the times。
- 同样的代码在同事的 PC 上也不起作用,所以不只是我。
- 我还有一个问题,因为我的目标系统是 RHEL,而不是 Windows(我的 Linux 工作站王国!)。所以我必须弄清楚如何解决
${os.detected.filesystem}
问题...
#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],看看是否适合你。
我一直在尝试对我的 gRPC 服务进行 SSL 验证(在明文模式下工作正常)。注意:这是在商业环境中限制了我的一些选择(例如开发环境和部署平台)。
我跟着 SECURITY.md which recommends using OpenSSL ... and therefore netty-tcnative ... which leads to Forked Tomcat Native 和一些选择:
netty-tcnative-{arch}
- 动态链接,要求目标系统上已安装 APR 和 OpenSSLnetty-tcnative-boringssl-static-{os_arch}
- 静态链接到 APR 和 google 的 OpenSSL 分支netty-tcnative-boringssl-static
- 静态链接 uber jar 与通用平台的本地库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
输出),但我得到了不同的运行时行为:
- 使用
<classifier>${os.detected.classifier}</classifier>
我得到java.lang.ClassNotFoundException: org.apache.tomcat.jni.SSL
- 硬编码到
<classifier>windows-x86_64</classifier>
我更进一步但仍然没有雪茄:现在 netty-tcnative 不会加载:java.lang.UnsatisfiedLinkError: C:\Temp\netty-tcnative1392766600896877072.dll: Can't find dependent libraries
(一条不寻常的路径,因为 DLL 已从 jar 复制到我的临时目录和System.load
从那里编辑)- 根据dependency walker, that DLL has a whole stack of dependencies some of which really don't appear on my filesystem. But it seems that's because depends.exe hasn't kept up with the times。
- 同样的代码在同事的 PC 上也不起作用,所以不只是我。
- 我还有一个问题,因为我的目标系统是 RHEL,而不是 Windows(我的 Linux 工作站王国!)。所以我必须弄清楚如何解决
${os.detected.filesystem}
问题...
#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],看看是否适合你。