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 并解决了这个问题。希望这对任何人都有帮助。
我正在从我的 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 并解决了这个问题。希望这对任何人都有帮助。