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



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

但是,当我将静态库与不同的服务集成并从该服务调用grpc静态库中的API时,它失败了,错误低于

创建握手器工厂失败,TSI_INVALID_ARGUMENT
无法为安全名称"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调用从测试应用程序工作,而不是从其他服务工作在同一个虚拟机上?欢迎提出任何建议。

我试图集成的应用程序使用的是libssl 1.0.2,它不支持TLS1.3,但grpc 1.35默认使用TLS1.3和openssl 1.1.1。因此,使用gRPC_SSL_PROVIDER=包构建了gRPC,并使用了libssl 1.0.2,从而解决了问题。希望这能帮助到任何人。

最新更新