将CloudFront与外部托管的DNS结合使用,指向EC2实例

时间:2018-11-04 20:41:06

标签: amazon-web-services ssl amazon-ec2 aws-certificate-manager amazon-cloudfront

我正在尝试使用ec2实例设置cloudfront。该域位于dreamhost上,我添加了一个CNAME记录,指向云端URL。

我在我的EC2实例上使用Lets Encrypt。如果我使用弹性IP并将其设置为dreamhost上的A记录,则它可以正常转发,并且一切正常。如果我将CNAME记录指向云端URL,则会收到502错误。

按照故障排除指南here,我使用在线服务检查了SSL证书,结果表明一切正常。

我想念什么?是否必须将cloudfront网址添加到我的证书中?

此外,我将发行版的SSL证书指向AWS证书管理器中托管的证书,我认为这最终指向了我的来源。我将证书指向我的网址,并添加了CNAME记录以验证所有权,所有这些似乎都可以正常工作。

更新:

我将ec2公共URL插入在线ssl检查器中,并得到以下结果。也许这可能是问题的一部分?如果输入弹性IP,我将得到相同的结果。看来这可能是罪魁祸首,但我不知道下一步是什么。回到谷歌搜索..

enter image description here

更新2:

从我正在阅读的内容中,我需要确保在我的ec2实例上安装了中间证书。我还了解到,在Apache 2.4中,fullchain.pem文件代替了旧的cert.pem文件为SSLCertificateFile

我修改了/etc/httpd/conf/httpd-le-ssl.conf的内容,如下所示:

   <VirtualHost *:443>
      DocumentRoot "/var/www/html"
      ServerName "test.example.com"
      ServerAlias "test.example.com"
      Include /etc/letsencrypt/options-ssl-apache.conf
      SSLCertificateFile /etc/letsencrypt/live/test.example.com/fullchain.pem
      SSLCertificateKeyFile /etc/letsencrypt/live/test.example.com/privkey.pem
   </VirtualHost>

更改该设置并重新启动httpd服务后,我的URL上仍然出现错误。当我将test.example.com插入SSL检查器时,它显示如下:

enter image description here

请记住,我发布的第一个屏幕快照使用的是弹性IP,而不是test.example.com网址,因此两者之间的可比性并不高。不幸的是,在进行更改之前,我没有test.example.com的屏幕截图,但是我仍然遇到502错误,因此显然无法修复。

更新3:

当我导航至test.example.com时,我的响应标题似乎显示server: CloudFront,这是朝着正确方向迈出的一步。我以前根本没有得到。

更新4:

我下载了openssl并能够获得以下信息。证书链甚至没有显示let加密作为证书源,这很奇怪。

我最初使用test.example.com的letencrypt证书设置EC2实例。然后,当我创建cloudfront分配时,我使用证书管理器创建了指向我的test.example.com的证书,我现在想知道我是否以某种方式配置了该错误,因为openssl输出仅显示了一个亚马逊证书。证书管理器和let加密证书之间的交互让我感到困惑,它们似乎都指向相同的url。啊。

我认为我将必须设置一个弹性负载平衡器并使用ELB中ACM的证书。然后我想我将不再需要在EC2实例上使用let加密证书吗?

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

如果您想将自定义SSL与专用IP结合使用,AWS将向您收取每月600美元的费用。 CloudFront将在边缘提供专用的IP地址,并使用您的SSL并与该IP地址一起使用。

您还可以将自定义SSL导入到您的AWS Cert Manager,然后将其分配给CloudFront端点。这种方法的唯一缺点是,您需要在证书续订期间再次更新SSL。

其他替代方案,

与第三方DNS提供商合作。

  1. 与您的DNS提供商创建CNAME记录。
  2. 使用AWS Certificate Manager创建AWS Secure Certificate,这可能需要使用CNAME或电子邮件地址进行域验证。这是免费的。
  3. 将CNAME记录添加到您的CloudFront分配中。
  4. 收到证书后,将证书分配给CloudFront端点

将会有额外的往返查询DNS解析为IP。

  

CNAME(解析)-> CloudFront主机DNS名称   (something.cloudfront.net)->解析为IP。

或者,(也是最佳方式

如果您将DNS移至Route 53,则可以将CloudFront分配到分发版,这将在单个DNS请求中解析您的服务域。

通过上述设置,我发现EC2不需要Lets Encrypt证书。

可在here中找到有关在CloudFront上使用AWS的自定义SSL证书的更多信息。

希望有帮助。

编辑:

验证SSL:

  1. 将您的云端起点指向S3存储桶。
  2. 验证Cloudfront URL是否正常运行,并与对象连接到S3存储桶。
  3. 使用“自定义域URL”进行验证,以确保自定义SSL证书有效。
  4. 现在将源更改为EC2服务器。
  5. 确保您记录请求和响应以进行调试。
  6. 再次验证您的自定义域网址。
  7. 如果收到5XX,请检查EC2服务器的响应。

答案 1 :(得分:0)

如果使用@Kannaiyan指出的第二种方法,则无需将域名移至AWS。只需创建一个托管区域并将该区域中生成的NS记录复制到您的DNS提供商。然后,您可以轻松地将您的域名(包括apex域)连接到Cloudfront发行版。

您可以查看我的答案here