适用于 ASP.NET Core 的 gRPC 的安全注意事项Security considerations in gRPC for ASP.NET Core

本文内容

作者:James Newton-King

本文提供了有关通过 .NET Core 保护 gRPC 的信息。

传输安全性Transport security

gRPC 消息使用 HTTP/2 进行发送和接收。我们建议:

  • 使用传输层安全性 (TLS) 以保护生产 gRPC 应用中的消息。
  • gRPC 服务应仅侦听并响应受保护的端口。

TLS 是在 Kestrel 中配置的。有关配置 Kestrel 终结点的详细信息,请参阅 Kestrel 终结点配置

异常Exceptions

异常消息通常被认为是不应透露给客户端的敏感数据。默认情况下,gRPC 不会将 gRPC 服务引发的异常的详细信息发送给客户端。客户端将收到指示出现错误的一般消息。使用 EnableDetailedErrors 可以替代(例如,在开发或测试中)向客户端的异常消息发送。异常消息不应在生产应用中向客户端公开。

消息大小限制Message size limits

到 gRPC 客户端和服务的传入消息将加载到内存中。消息大小限制是一种有助于防止 gRPC 消耗过多资源的机制。

gRPC 使用每个消息的大小限制来管理传入和传出消息。默认情况下,gRPC 将传入消息限制为 4 MB。传出消息没有限制。

在服务器上,可以使用 AddGrpc 为应用中的所有服务配置 gRPC 消息限制:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddGrpc(options =>
  4. {
  5. options.MaxReceiveMessageSize = 1 * 1024 * 1024; // 1 MB
  6. options.MaxSendMessageSize = 1 * 1024 * 1024; // 1 MB
  7. });
  8. }

还可以使用 AddServiceOptions<TService> 为单个服务配置限制。有关配置消息大小限制的详细信息,请参阅 gRPC 配置

客户端证书验证Client certificate validation

建立连接后,将首先验证客户端证书默认情况下,Kestrel 不会对连接的客户端证书执行额外验证。

建议由客户端证书保护的 gRPC 服务使用 Microsoft.AspNetCore.Authentication.Certificate 包。ASP.NET Core 认证身份验证将对客户端证书执行其他验证,包括:

  • 验证证书是否具有有效的增强型密钥使用 (EKU)
  • 验证是否在其有效期内
  • 检查证书吊销