我在 Golang 中有一個gRPC 服務器,它使用以下 ServerOptions 啟用了 mTLS:// getServerOptions returns a list of GRPC server options.// Current options are TLS certs and opencensus stats handler.func (h *serviceHandler) getServerOptions() []grpc.ServerOption { tlsCer, err := tls.LoadX509KeyPair(tlsDir+"tls.crt", tlsDir+"tls.key") if err != nil { logger.WithError(err).Fatal("failed to generate credentials") } cfg := &tls.Config{ Certificates: []tls.Certificate{tlsCer}, ClientAuth: tls.RequireAndVerifyClientCert, GetConfigForClient: func(*tls.ClientHelloInfo) (*tls.Config, error) { h.certMutex.RLock() defer h.certMutex.RUnlock() return &tls.Config{ Certificates: []tls.Certificate{tlsCer}, ClientAuth: tls.RequireAndVerifyClientCert, ClientCAs: h.caCertPool, }, nil }, } // Add options for creds and OpenCensus stats handler to enable stats and tracing. return []grpc.ServerOption{grpc.Creds(credentials.NewTLS(cfg)), grpc.StatsHandler(&ocgrpc.ServerHandler{})}}服務器對于 Golang 中的gRPC 客戶端工作正常,但在證書交換握手后對于以下 gRPC c# 客戶端失敗。 static async Task Main(string[] args) { string baseAddress = "x.x.x.x"; var x509Cert = new X509Certificate2("client.pfx", "123"); var client = CreateClientWithCert("https://" + baseAddress + ":443", x509Cert); try { var response = await client.PostAllocateAsync(new AllocationRequest {Namespace = "Default"}); Console.Write(response.State.ToString()); } catch(RpcException e) { Console.WriteLine($"gRPC error: {e.Status.Detail}"); } catch { Console.WriteLine($"Unexpected error calling agones-allocator"); throw; } } }
1 回答

RISEBY
TA貢獻1856條經驗 獲得超5個贊
我寫了一些示例代碼來重現這里報告的跨平臺不兼容問題。
根本原因是在 golang 服務器中使用 GetConfigForClient 時,在這種情況下用于刷新客戶端 CA 證書,來自 C# 客戶端的請求失敗。但是,當它被替換為VerifyPeerCertificate時,問題得到了解決。
- 1 回答
- 0 關注
- 151 瀏覽
添加回答
舉報
0/150
提交
取消