【发布时间】:2016-05-18 10:52:57
【问题描述】:
我一直在尝试对我的 gRPC 服务进行 SSL 化(在纯文本模式下运行良好)。注意:这是在商业环境中限制了我的一些选择(例如开发环境和部署平台)。
我关注了SECURITY.md,它建议使用 OpenSSL ...,因此netty-tcnative ...导致Forked Tomcat Native 和许多选择:
-
netty-tcnative-{arch}- 动态链接,需要已在目标系统上安装 APR 和 OpenSSL -
netty-tcnative-boringssl-static-{os_arch}- 静态链接到 APR 和谷歌的 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,该DLL 有一个完整的依赖堆栈,其中一些确实没有出现在我的文件系统中。但这似乎是因为depends.exe hasn't kept up with the times。
- 同样的代码也不能在同事的电脑上运行,所以不只是我。
- 我仍然有一个问题,因为我的目标系统是 RHEL,而不是 Windows(我的 Linux 工作站王国!)。所以我必须弄清楚如何解决
${os.detected.filesystem}问题...
#4
我猜这可能有用。但它不在 maven central 上,所以不是我喜欢的路径。
#1
可能会起作用。但这意味着在我们部署的任何服务器上安装 APR 和 OpenSSL。我不喜欢我必须使用内部 PaaS 的机会。暂时避免。
TLS 与 JDK
我可能试试这个。 但是the doc 强烈建议您不要这样做,因为您必须摆弄 Java 的引导类路径(我可以在这里想象更多的 PaaS 障碍,也许是没有根据的......)。 而且它的性能显然并不过分(比 OpenSSL 慢 10 倍以上)。 而且它很脆弱(Jetty-ALPN 版本必须与使用的 JRE 完全对应,尽管听起来可能有解决方案)。
底线
如果我不能解决这个问题,它可能会为我的项目杀死 gRPC。这是否是一件坏事还有待商榷......与此同时,有没有人有任何想法或工作的 SSL 化 gRPC 客户端/服务器应用程序(grpc-java/examples 都只使用纯文本)。
【问题讨论】:
-
对于#3,您必须至少使用 grpc-java-0.14.0 才能引入足够新的 Netty。此外,您需要使用至少 1.1.33.Fork16 的 tcnative。也就是说,您仍然会遇到与#2 相同的问题。我们正在调查 #2 有什么问题。
-
谢谢,我现在使用的是 1.1.33.Fork16(之前在 Fork15 上使用过),但正如你所说,我仍然遇到同样的问题。但看起来@nmittler 正在努力:-)
-
FWIW 我也切换到 grpc-java-0.14.0(从 0.13.2)重试#3,但得到了 IllegalArgumentException(但单步执行代码,它看起来与#2 的失败:无法加载依赖库)。