PHP 无法连接 TLS 证书认证的 gRPC(golang 实现)

证书生成

openssl ecparam -genkey -name secp384r1 -out server.key
openssl req -new -x509 -sha256 -key server.key -out server.pem -days 3650

Common Name (eg, fully qualified host name) []:test

golang 客户端连接正常

c, err := credentials.NewClientTLSFromFile("./config/server/server.pem", "test")
if err != nil {
    log.Fatalf("credentials.NewClientTLSFromFile err: %v", err)
}

conn, err := grpc.Dial(":50052", grpc.WithTransportCredentials(c))
if err != nil {
    log.Fatalf("grpc.Dial err: %v", err)
}
defer conn.Close()

client := pb.NewQueryOnlineWsClient(conn)
resp, err := client.OnlineConn(context.Background(), &pb.QueryOnlineRequest{CompanyId: 1})
if err != nil {
    log.Fatalf("client.Search err: %v", err)
}

log.Printf("resp: %s", resp.GetOnline())

PHP 客户端连接失败

/*$client = new QueryOnlineWsClient('192.168.20.10:50052', [
     'credentials' => \Grpc\ChannelCredentials::createInsecure()
]);*/

$pem = file_get_contents(storage_path("server.pem"));

$client = new QueryOnlineWsClient('192.168.20.10:50052', [
    'credentials' => \Grpc\ChannelCredentials::createSsl($pem),
    'grpc.ssl_target_name_override' => 'test',
]);

$request = new QueryOnlineRequest();

$request->setCompanyId(1);
$request->setConnKey(['1']);

list ($response, $status) = $client->OnlineConn($request)->wait();

dump($status);

输出

{#911 ▼
  +"metadata": []
  +"code": 14
  +"details": "Connect Failed"
}

总结

  • gRPC服务端如果不启用 TLS 认证 。PHP 客户端是正常连接的
  • server.pem 正确引入并保证正确
  • 在同样启用 TLS 认证, golang 客户端可以连接, PHP 无法连接

大家帮我看看,我的代码问题是出在那里呢?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!