如何导出AWS Certificate Manager中的SSL证书用于自托管服务器应用
从AWS Certificate Manager(ACM)导出SSL证书用于自托管服务操作指引
提前避坑:先确认你的证书类型
不同类型的ACM证书,导出权限天差地别,先搞清楚自己手里的证书是哪类,能少走几小时的弯路:
- 如果申请证书时,你选了让AWS自动生成公私钥对的免费公有信任证书:这类证书的私钥是AWS用加密方式托管的,没有任何办法可以导出私钥,只能绑定到ALB、CloudFront、API网关这类AWS原生集成服务用,根本没法挪到你自己的服务器上跑。
- 如果申请证书时,你是自己在本地生成了密钥对,做了CSR提交给ACM走验证流程:这种的私钥本来就存在你自己本地,根本不需要找AWS要私钥,只要把ACM下发的证书和完整链拉下来,和你本地存的私钥拼一起就能用。
- 如果你用的是AWS私有CA发的ACM私有证书:这类证书没有导出限制,可以拿到完整的证书、证书链、可解密的私钥文件。
操作:本地CSR申请的公有证书导出
- 先把你本地当初生成CSR时对应的私钥文件(一般是
server.key格式)找好存到安全位置,这个文件如果丢了,就算把证书拉下来也没法用。 - 本地装好AWS CLI,配置好有对应证书读权限的访问凭证,切换到证书所在的AWS区域。
- 执行拉取证书的命令,把返回的内容存到本地文件:
aws acm get-certificate --certificate-arn <你的ACM证书ARN> --region <证书所在区域> --output text > exported_cert_bundle.pem - 打开存好的
exported_cert_bundle.pem,里面的内容是完整的服务器证书+中间CA证书链,不需要额外调整。 - 把这个证书文件和你本地的私钥文件上传到自托管服务器,配置Nginx、Apache这类服务的时候直接选这两个文件就能正常启用HTTPS。
操作:私有CA颁发的ACM私有证书导出
- 先给当前执行操作的IAM账号配好两个权限:一是ACM的
ExportCertificate操作权限,二是证书关联的KMS密钥的解密权限(私钥是用这个KMS密钥加密存的,没权限导不出来)。 - 在本地写一个纯文本文件,随便设置一段用来加密导出私钥的密码,比如文件名存成
key_pass.txt,文件内容就是你设的密码字符串。 - 执行导出命令:
aws acm export-certificate --certificate-arn <你的证书ARN> --passphrase file://./key_pass.txt --region <证书所在区域> - 命令执行成功后,返回的JSON结果里会有三个核心字段:
Certificate:服务器端证书的PEM内容CertificateChain:完整的中间CA证书链PEM内容PrivateKey:用你刚才设的密码加密后的私钥PEM内容
- 把这三个字段的内容分别存成三个文件:
server_cert.pem、server_chain.pem、encrypted_private.key - 用OpenSSL把加密的私钥解密成Web服务可以直接加载的无密码私钥:
openssl rsa -in encrypted_private.key -out server_private.key -passin pass:<你之前在key_pass.txt里设置的密码> - 把这三个文件(
server_cert.pem、server_chain.pem、server_private.key)上传到自托管服务器,配置HTTPS时直接引用即可。
常见踩坑点
- 执行命令报权限不足:先查当前CLI凭证对应的IAM身份,是不是没开ACM的读/导出权限,是不是没有对应KMS密钥的解密权限,别一上来就怀疑命令错了。
- 部署后浏览器报证书不受信任:检查你存的证书文件是不是只存了最顶层的服务器证书,没把返回的中间链拼进去,单独存顶级证书是会出现链不完整的问题的。
- 手里是AWS自动生成密钥的公有证书,找遍了方法拿不到私钥:这种情况没有任何可行的变通方法,要么就把这个证书绑定在AWS的负载均衡/CDN上用,要么就重新走一遍证书申请流程,选自定义CSR的方式重新申请,拿到自己掌控私钥的证书再迁移。
内容的提问来源于stack exchange,提问作者Himanshu Shukla
相关产品推荐
相关产品推荐

