EC2上通过PuTTY配置Nginx:如何获取AWS公证书的SSL文件?
解决AWS ACM证书在EC2 Nginx中使用的问题
嘿,我帮你理清这个困惑!首先得明确一个关键点:AWS Certificate Manager(ACM)的公有证书是无法直接下载私钥(.key)文件的——这是AWS的设计限制,因为ACM主要是为了和AWS托管服务(比如ALB、CloudFront)无缝集成,而非直接提供给EC2上的自托管服务使用。不过别担心,有两个靠谱的解决方案,看哪种更适合你:
方案一:用Application Load Balancer(ALB)终止SSL(推荐)
这是最省心的方案,也是AWS推荐的做法,不需要在EC2的Nginx里处理任何SSL配置:
- 登录AWS控制台,创建一个Application Load Balancer,在配置HTTPS监听器(443端口)时,选择你已有的ACM公有证书
- 配置目标组,将流量转发到你的EC2实例的HTTP端口(比如80),确保目标组能正常检测到EC2的健康状态
- 调整EC2的安全组规则:只允许ALB的安全组访问EC2的80端口,同时可以关闭EC2直接对外的443端口(提升安全性)
- 最后把你的域名解析到ALB的DNS地址即可
这样用户访问你的域名的HTTPS请求时,ALB会自动用ACM证书完成SSL加密,然后把解密后的HTTP请求转发给EC2上的Nginx。你不需要修改Nginx的SSL相关配置,ACM还会自动帮你续期证书,完全不用手动维护。
方案二:在EC2上直接使用ACM证书(仅适用于自定义CSR申请的证书)
如果你坚持要在Nginx里处理SSL,那只有一种情况可行:你是通过自己生成的CSR(证书签名请求)提交到ACM申请的公有证书。这种情况下可以通过AWS CLI导出证书文件,步骤如下:
- 给你的EC2实例绑定一个IAM角色,该角色需要拥有
acm:ExportCertificate和ssm:PutParameter等相关权限(建议配置最小权限,避免过度授权) - 在EC2上安装并配置AWS CLI(确保能正常访问ACM服务)
- 创建一个密码文件(比如
passphrase.txt),里面输入用来加密私钥的密码(注意保管好这个密码) - 运行以下命令导出证书:
这个命令会返回三个内容:证书链(CertificateChain)、证书(Certificate)、加密后的私钥(PrivateKey)aws acm export-certificate --certificate-arn "你的证书ARN" --passphrase file://passphrase.txt - 把这三个内容分别存储到AWS Systems Manager Parameter Store的安全字符串类型参数中(避免明文泄露)
- 在EC2上,用AWS CLI从SSM拉取这些内容,解密私钥,保存成对应的文件:
- 拉取证书并保存为
domain.crt - 拉取证书链并追加到
domain.crt(或者单独保存为chain.crt,在Nginx里配置ssl_certificate_chain) - 拉取加密的私钥,用你设置的密码解密后保存为
domain.key
- 拉取证书并保存为
- 最后在Nginx的配置文件中指定这两个文件:
重启Nginx即可生效server { listen 443 ssl; server_name your-domain.com; ssl_certificate /path/to/domain.crt; ssl_certificate_key /path/to/domain.key; # 其他SSL配置... }
⚠️ 注意:如果你的ACM证书是AWS自动生成的(没有提交自定义CSR),那是无法导出私钥的,这个方案就不适用了。
额外提示
如果上述方案都不符合你的需求,也可以考虑使用Let's Encrypt等免费证书颁发机构,生成可以直接下载的.crt和.key文件,然后在Nginx里配置,同时可以用certbot自动续期证书,也是一个不错的替代方案。
内容的提问来源于stack exchange,提问作者Yoni
相关产品推荐
相关产品推荐

