如何从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加密:- 将ACM证书关联到负载均衡器的HTTPS监听端口;
- 负载均衡器将解密后的明文流量转发到GRPC服务;
- 服务内部无需处理TLS证书,所有加密操作由AWS负载均衡器完成。
方案二:自行生成证书并导入ACM
若必须在GRPC服务端直接处理TLS:- 用OpenSSL工具自行生成私钥和证书签名请求(CSR):
# 生成2048位RSA私钥 openssl genrsa -out private.key 2048 # 生成证书签名请求 openssl req -new -key private.key -out certificate.csr - 在ACM中导入该CSR获取受信任的公证书;
- 保留自己生成的
private.key,将其与ACM下载的证书文件一起提供给GRPC服务使用。
- 用OpenSSL工具自行生成私钥和证书签名请求(CSR):
方案三:用Secrets Manager存储私钥
若已有私钥,可通过AWS Secrets Manager安全托管:- 将私钥上传到Secrets Manager;
- 给GRPC服务所在实例配置IAM权限,允许读取该密钥;
- 服务启动时从Secrets Manager拉取私钥内容,配合ACM证书,通过
credentials.NewTLS方法(替代NewServerTLSFromFile)直接从内存加载TLS凭据,无需写入本地文件。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

