grpc/c++ 握手器工厂创建失败 TSI_INVALID_ARGUMENT

grpc/c++ Handshaker factory creation failed with TSI_INVALID_ARGUMENT

我正在从我的 grpc c++ 客户端创建一个静态库,我能够使用测试应用程序在 grpc 静态库中成功调用 API。

但是当我将静态库与其他服务集成并从该服务调用 grpc 静态库中的 API 时,它失败并显示以下错误

握手器工厂创建失败 TSI_INVALID_ARGUMENT。
无法为安全名称创建安全子通道 'xx.xx.xx.xx:xx'
创建子频道时未能创建频道参数。

在我复制时看到上述错误的同一台 VM 和 运行 调用 grpc 客户端的测试应用程序,它工作正常。

这是客户端代码,基于(https://www.programmersought.com/article/7290364277/):

int main(int argc, char** argv) {
    grpc::SslCredentialsOptions ssl_options;
    ssl_options.pem_root_certs = SERVER_CRT;
    // Create a default SSL ChannelCredentials object.
    auto channel_creds = grpc::SslCredentials(ssl_options);
    grpc::ChannelArguments cargs;
    cargs.SetSslTargetNameOverride("xxx.xxx.com"); // If you add DNS, you don't need this.

    // Create a channel using the credentials created in the previous step.
    auto channel = grpc::CreateCustomChannel("1.2.3.4:8000", channel_creds , cargs);

    // Instantiate the client.
    MailClient tester(channel);

}
    
ssl_options.pem_root_certs = SERVER_CRT;

// The contents of server.crt
const char SERVER_CRT[] = R"(
-----BEGIN CERTIFICATE-----
TjERMA8GA1UECAwIU2hhbmdoYWkxEjAQBgNVBAcMCVNvbmdqaWFuZzEPMA0GA1UE
...
E6v50RCQgtWGmna+oy1I2UTVABdjBFnyKPEuz106mBfOhT6cg80hBHVgrV7sLHq8
76QolJm8yzZPL1qpiO4dKHHsCP6R
-----END CERTIFICATE-----
)";

我提供证书的方式可能有问题?

为什么 grpc 客户端中的 rpc 调用从测试应用程序工作,而不是从不同的服务工作 在同一个虚拟机上? 任何建议表示赞赏。

我尝试集成的应用程序使用的是不支持 TLS1.3 的 libssl 1.0.2,但默认情况下 grpc 1.35 使用 TLS1.3 和 openssl 1.1.1。所以用 gRPC_SSL_PROVIDER=package 构建了 gRPC,它选择了 libssl 1.0.2 并解决了这个问题。希望这对任何人都有帮助。