图书馆的具体错误信息
CompletedListGrpc.Core.RpcException: Status(StatusCode=Unavailable, Detail="Connect Failed")
- 我特别提到这个图书馆:https://github.com/googleapis/google-cloud-dotnet/tree/master/apis/Google.Cloud.Firestore
- 我特别遇到 google-cloud-firestore 服务的问题(尽管该问题可能发生在另一个依赖库中,也许是身份验证)
- 有问题的防火墙是 Palo Alto Networks。它具有安装在企业工作站上且受信任的企业证书。防火墙本质上充当 MITM 来解密流量,以便更深入地分析 TLS 流量。
当为 firestore.googleapis.com 禁用防火墙 MITM 功能时,库工作正常。当启用 MITM 功能时,它不起作用。
子问题:
1) 库代码是否有硬编码证书检查? (我没找到)
public static gaxgrpc::ServiceEndpoint DefaultEndpoint { get; } = new gaxgrpc::ServiceEndpoint("firestore.googleapis.com", 443);
- 硬编码证书没有意义,因为证书会更新,有时旧证书会被撤销。
- grpc 是非常标准的,除了 Google 使用之外共享(参见 https://grpc.io/)。
- 假设 grpc 不包含下游依赖项的显式证书是合理的
- 如果 firestore 打算断言证书,可以合理地假设这行代码连同 URL 一起完成
2a) .Net Framework 是否自动信任 Windows 信任库中的证书?是否需要任何代码才能使这项工作正常进行?
.Net Framework 似乎可以与 Windows 证书存储一起使用 - 请参阅 https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/working-with-certificates
2b) 也许证书只受信任但交互用户而不是整个机器,因此服务帐户看不到该证书 - 我会检查一下...
3) 如果这是“连接失败”的原因,库是否会出现关于证书的特定错误?
最佳答案
这可能只是 Windows 证书存储配置错误。也许您运行该软件的帐户无权访问正确的根 CA。不管是什么原因,有一种常见的 .Net 方法可以手动批准证书。
1) 首先,尝试绕过检查的测试。见https://stackoverflow.com/a/2675183/887092
ServicePointManager
.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) => true;
不要让此代码保留在生产中,仅使用它来查看此路径是否可行。
2) 接下来自定义此函数以手动检查根 CA 的特定证书和相关证书。强烈建议使用一个库来帮助你,但你可以让它与核心 .net 库一起工作。
参见 C# / .NET - How to allow a "custom" Root-CA for HTTPS in my application (only)?
结论
如果这个答案不起作用,我会删除它。
关于.net - 为什么 C# Google.Cloud.Firestore 库无法连接到企业 MITM 防火墙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57471956/