You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从AWS获取适用于GRPC服务的SSL/TLS证书

使用AWS证书管理器为GRPC服务获取可用的TLS凭据

问题背景

我编写了一个GRPC服务,服务器代码如下:

type GrpcServer[TServer any] func(*Handler) TServer

type GrpcRegistrar[TServer any] func(grpc.ServiceRegistrar, TServer)

type GrpcService[TServer any] struct {
    handler         *Handler
    inner           GrpcServer[TServer]
    registrar       GrpcRegistrar[TServer]
    certificateFile string
    certificateKey  string
    addr            string
    clientAddr      string
    gatewayAddr     string
}

func (service *GrpcService[TServer]) runGRPC(lis net.Listener, opts ...grpc.ServerOption) (*grpc.Server, error) {

    creds, err := credentials.NewServerTLSFromFile(service.certificateFile, service.certificateKey)
    if err != nil {
        return nil, service.handler.Logger.Error(err, "Failed to setup TLS")
    }

    opts = append([]grpc.ServerOption{grpc.Creds(creds)}, opts...)
    server := grpc.NewServer(opts...)

    service.registrar(server, service.inner(service.handler))

    service.handler.Logger.Log("GRPC listening on %s", service.addr)
    if err := server.Serve(lis); err != nil {
        return nil, service.handler.Logger.Error(err, "GRPC server failed unrecoverably")
    }

    return server, nil
}

当前我的问题是,该服务需要证书文件和证书密钥才能配置TLS。我了解可以通过AWS证书管理器创建公证书并使用AWS CLI下载,但仅能获取证书值,缺少所需的密钥文件。请问是否有办法从AWS获取可作为GRPC服务器凭据的证书?

解决方案

核心说明

AWS证书管理器(ACM)不会提供私钥下载——这是安全设计的要求,私钥在ACM创建时就被加密存储,仅AWS内部托管服务(如ALB、CloudFront)可直接调用,无法导出到外部服务器使用。所以直接从ACM获取密钥文件给GRPC服务用是行不通的。

可行替代方案

  • 方案一:通过AWS负载均衡器终止TLS
    如果GRPC服务部署在AWS托管环境(ECS、EKS、EC2等),可以用Application Load Balancer(ALB)或Network Load Balancer(NLB)处理TLS加密:

    1. 将ACM证书关联到负载均衡器的HTTPS监听端口;
    2. 负载均衡器将解密后的明文流量转发到GRPC服务;
    3. 服务内部无需处理TLS证书,所有加密操作由AWS负载均衡器完成。
  • 方案二:自行生成证书并导入ACM
    若必须在GRPC服务端直接处理TLS:

    1. 用OpenSSL工具自行生成私钥和证书签名请求(CSR):
      # 生成2048位RSA私钥
      openssl genrsa -out private.key 2048
      # 生成证书签名请求
      openssl req -new -key private.key -out certificate.csr
      
    2. 在ACM中导入该CSR获取受信任的公证书;
    3. 保留自己生成的private.key,将其与ACM下载的证书文件一起提供给GRPC服务使用。
  • 方案三:用Secrets Manager存储私钥
    若已有私钥,可通过AWS Secrets Manager安全托管:

    1. 将私钥上传到Secrets Manager;
    2. 给GRPC服务所在实例配置IAM权限,允许读取该密钥;
    3. 服务启动时从Secrets Manager拉取私钥内容,配合ACM证书,通过credentials.NewTLS方法(替代NewServerTLSFromFile)直接从内存加载TLS凭据,无需写入本地文件。

内容的提问来源于stack exchange,提问作者Woody1193

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:45:22