我们拥有一个自定义源的Cloudfront发行版,该版本在很长一段时间内都运行良好,为我们的某个站点提供静态资源。就在今天早上,我们注意到我们的徽标显示为断开链接。
经过进一步调查,Cloudfront将返回一条奇怪的错误消息,这是我以前从未见过的URL in question:
ERROR
无法满足请求。
由cloudfront(CloudFront)生成
此分发中的其他几个Cloudfront URL返回相同的错误,但其他(同样,来自同一分发)的工作正常。我没有看到什么有效,哪些无效的模式。
其他一些数据点:
知道这里发生了什么吗?我以前从未见过Cloudfront这样做过。
更新
以下是来自Cloudfront的逐字HTTP响应:
$ http GET https://d2yu7foswg1yra.cloudfront.net/static/img/crossway_logo.png
HTTP/1.1 502 Bad Gateway
Age: 213
Connection: keep-alive
Content-Length: 472
Content-Type: text/html
Date: Wed, 18 Dec 2013 17:57:46 GMT
Server: CloudFront
Via: 1.1 f319e8962c0268d31d3828d4b9d41f98.cloudfront.net (CloudFront)
X-Amz-Cf-Id: H_HGBG3sTOqEomHzHubi8ruLbGXe2MRyVhGBn4apM0y_LjQa_9W2Jg==
X-Cache: Error from cloudfront
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
</BODY></HTML>
<BR clear="all">
<HR noshade size="1px">
<ADDRESS>
Generated by cloudfront (CloudFront)
</ADDRESS>
</BODY></HTML>
答案 0 :(得分:125)
我今天在Amazon Cloudfront上遇到此错误。这是因为我使用的cname(例如cdn.example.com)没有添加到“alternate cnames”下的分发设置中,我只将cdn.example.com转发到我的站点/主机控制面板中的cloudfront域,但是您还需要将其添加到Amazon CloudFront面板。
答案 1 :(得分:31)
我最近遇到了类似的问题,原因是我使用的是ssl_ciphers。
&#34; CloudFront使用SSLv3或TLSv1协议以及AES128-SHA1或RC4-MD5密码将HTTPS请求转发到源服务器。如果源服务器不支持AES128-SHA1或RC4-MD5密码,则CloudFront无法与您的源建立SSL连接。 &#34;
我不得不更改我的nginx配置,将AES128-SHA(不推荐的RC4:HIGH)添加到ssl_ciphers以修复302错误。我希望这有帮助。我已经从我的ssl.conf
粘贴了这一行ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:RSA+3DES:AES128-SHA:!ADH:!AECDH:!MD5;
答案 2 :(得分:14)
找到我的答案并在此处添加,以防大卫(和其他人)帮助。
原来我的原始服务器(比如www.example.com)上有301重定向设置,将HTTP更改为HTTPS:
HTTP/1.1 301 Moved Permanently
Location: https://www.example.com/images/Foo_01.jpg
但是,我的Origin Protocol Policy仅设置为HTTP。这导致CloudFront找不到我的文件并抛出502错误。另外,我认为它缓存了502错误5分钟左右,因为它在删除301重定向后没有立即工作。
希望有所帮助!
答案 3 :(得分:8)
在我们的案例中,所有内容都很好,但是大部分时间都需要考虑到这一点:
TLDR:检查证书路径以确保根证书正确无误。对于COMODO证书,它应该说“USERTrust”并由“AddTrust External CA Root”发布。不是“COMODO RSA认证机构”发布的“COMODO”。
来自CloudFront文档: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html
启用了正确的密码如果源服务器返回无效证书或自签名证书,或者原始服务器以错误的顺序返回证书链,CloudFront将丢弃TCP连接,返回HTTP错误代码502,并设置X-Cache标题为来自cloudfront的错误。
根据Google,Firefox和ssl-checker,我们的证书有效: https://www.sslshopper.com/ssl-checker.html
然而,ssl检查链中的最后一个证书是“COMODO RSA域验证安全服务器CA”,由“COMODO RSA证书颁发机构”发布
似乎CloudFront不持有“COMODO RSA证书颁发机构”的证书,因此认为原始服务器提供的证书是自签名的。
这显然是在突然停止之前工作了很长时间。发生了什么事情我刚刚更新了今年的证书,但在导入过程中,所有以前的证书的证书路径中都发生了一些变化。他们都开始引用“COMODO RSA认证机构”,而在链条更长,根目录是“AddTrust External CA Root”之前。
因此,切换回较旧的证书并未解决云端问题。
我不得不删除名为“COMODO RSA Certification Authority”的额外证书,该证书没有引用AddTrust。执行此操作后,我的所有网站证书路径都会更新,以便再次指向AddTrust / USERTrust。注意也可以从路径中打开坏根证书,点击“详细信息” - &gt; “编辑属性”,然后以这种方式禁用它。这立即更新了路径。您可能还需要删除“个人”和“受信任的根证书颁发机构”下的证书的多个副本
最后,我不得不在IIS中重新选择证书,以使其服务于新的证书链。
毕竟,ssl-checker开始在链中显示第三个证书,该证书指向“AddTrust External CA Root”
最后,CloudFront接受了原始服务器的证书,并将提供的链称为受信任的。我们的CDN再次开始正常工作!
为了防止将来发生这种情况,我们需要从具有正确证书链的机器导出我们新生成的证书,即不信任或删除“COMODO RSA Certification Authroity”颁发的证书“COMODO RSA Certification Authroity”(在2038年到期)。这似乎只影响Windows机器,默认安装此证书。
答案 4 :(得分:2)
我刚刚解决了这个问题,在我的情况下,它确实与重定向有关,但与我的CloudFront Origin或Behavior中的错误设置无关。如果您的源服务器仍然重定向到原始URL,而不是您为您的Cloudfront URL设置的,则会发生这种情况。如果您忘记更改配置,这似乎很常见。例如,如果您有www.yoursite.com CNAME到您的Cloudfront分发版,请访问www.yoursiteorigin.com。显然人们会来www.yoursite.com。但是,如果您的代码尝试重定向到www.yoursiteorigin.com上的任何页面,您将收到此错误。
对我来说,我的来源仍然是对我的原始网址进行http-&gt; https重定向,而不是我的Cloudfront网址。
答案 5 :(得分:2)
在我的情况下,这是因为我们有一个无效的ssl证书。问题出现在我们的临时箱上,我们也使用了我们的产品证书。在过去的几年里,它已经使用了这种配置,但突然间我们开始出现这个错误。奇怪。
如果其他人收到此错误,请检查ssl证书是否有效。您可以通过AWS CloudFront分配界面启用到s3的日志记录以帮助调试。
此外,您可以在此处参考亚马逊的文档:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/SecureConnections.html
答案 6 :(得分:2)
另一种可能的解决方案:我有一个登台服务器,通过HTTP为站点和Cloudfront资产提供服务。我的原点设置为&#34;匹配查看器&#34;而不是&#34; HTTP Only&#34;。我还使用HTTPS Everywhere扩展程序,该扩展程序将所有http://*.cloudfront.net
网址重定向到https://*
版本。由于登台服务器无法通过SSL提供,而且Cloudfront与查看器匹配,因此无法在https://example.com
找到资产并缓存一堆502.
答案 7 :(得分:1)
在我们的案例中,我们已经放弃了对原始服务器上的PCI-DSS合规性的SSL3,TLS1.0和TLS1.1的支持。但是,您必须在CloudFront原始服务器配置上手动添加对TLS 1.1+的支持。 AWS控制台显示客户端到CF的SSL设置,但在向下钻取之前不会轻易显示CF到源的设置。要修复,请在CloudFront下的AWS控制台中进行修复:
答案 8 :(得分:1)
对于我的特殊情况,这是由于CloudFront Behavior背后的Origin ALB拥有DEFAULT ACM证书所指向的另一个域名。
要解决此问题,我必须:
答案 9 :(得分:0)
我遇到了这个问题,在我停止使用代理后解决了这个问题。也许CloudFront将一些IP列入黑名单。
答案 10 :(得分:0)
通过连接我的证书来生成有效的证书链(使用GoDaddy标准SSL + Nginx)来解决此问题。
http://nginx.org/en/docs/http/configuring_https_servers.html#chains
生成链:
cat 123456789.crt gd_bundle-g2-g1.crt > my.domain.com.chained.crt
然后:
ssl_certificate /etc/nginx/ssl/my.domain.com.chained.crt;
ssl_certificate_key /etc/nginx/ssl/my.domain.com.key;
希望它有所帮助!
答案 11 :(得分:0)
就我而言,我使用nginx作为API网关URL的反向代理。我得到了同样的错误。
当我将以下两行添加到Nginx配置时,我解决了这个问题:
proxy_set_header Host "XXXXXX.execute-api.REGION.amazonaws.com";
proxy_ssl_server_name on;
来源在这里:Setting up proxy_pass on nginx to make API calls to API Gateway
答案 12 :(得分:0)
在我的情况下,问题是我同时使用了Amazon的Cloudflare和Cloudfront的Cloudfront,而Cloudfront不喜欢我提供的Cloudflare设置。
更具体地说,在Cloudflare的“加密”设置中,我已将“最小TLS设置”设置为1.2,而没有为Cloudfront中的分发启用TLS 1.2通信设置。这足以使Cloudfront在尝试连接到受Cloudflare保护的服务器时声明502 Bad Gateway错误。
要解决此问题,我必须在该Cloudfront发行版的“原始设置”中禁用SSLv3支持,并启用TLS 1.2作为该原始服务器支持的协议。
为调试此问题,我使用了curl的命令行版本,以查看从CDN询问映像时Cloudfront实际返回的内容,并且我还使用了openssl的命令行版本来确切确定哪个版本。 Cloudflare提供的协议(不提供TLS 1.0)。
tl:dr;确保所有内容都能接受并要求TLS 1.2,或者在您阅读本文时,每个人都在使用最新的和最先进的TLS。
答案 13 :(得分:0)
对于HTTPS查看器请求CloudFront转发到该来源,来源服务器上SSL证书中的域名之一必须与您为“来源域名”指定的域名匹配。否则,CloudFront会使用HTTP状态代码502(错误网关)响应查看器请求,而不是返回所请求的对象。
在大多数情况下,您可能希望CloudFront使用“仅HTTP”,因为它从也可能由Amazon托管的服务器中获取对象。此步骤无需额外的HTTPS复杂性。
请注意,这与Viewer Protocol Policy不同。您可以详细了解两个here之间的区别。