web-dev-qa-db-fra.com

Erreur CloudFront lors de la desserte via HTTPS avec SNI

Amazon a récemment mis en place une nouvelle fonctionnalité sur CloudFront qui prend en charge gratuitement les certificats SSL personnalisés à l'aide de SNI (Server Name Indication). 

Ma distribution a été mise en place avec un certificat gratuit de classe 1 de StartSSL et tout fonctionnait bien lorsque je me suis rendu compte que le site disparaîtrait peu de temps après son déploiement. Running SSL Checker indique que mon certificat fonctionne correctement:

SSL check

Mais ensuite, j'appuyais sur cette page d'erreur lorsque j'essayais d'accéder au site via HTTPS (cela fonctionnerait pour la première demande, puis disparaîtrait lors de tentatives de connexion ultérieures).

CF error

Voici une sortie commentée lors de l'accès avec ssl (réussit sur l'index): 

$ curl -I -v -ssl https://wikichen.is
* Adding handle: conn: 0x7f9f82804000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f9f82804000) send_pipe: 1, recv_pipe: 0
* About to connect() to wikichen.is port 443 (#0)
*   Trying 54.230.141.222...
* Connected to wikichen.is (54.230.141.222) port 443 (#0)
* TLS 1.2 connection using TLS_RSA_WITH_RC4_128_MD5
* Server certificate: www.wikichen.is (6w984WNu7vM5OrdU)
* Server certificate: StartCom Class 1 Primary Intermediate Server CA
* Server certificate: StartCom Certification Authority
> HEAD / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: wikichen.is
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8
< Content-Length: 1153
Content-Length: 1153
< Connection: keep-alive
Connection: keep-alive
< Date: Sun, 09 Mar 2014 16:09:54 GMT
Date: Sun, 09 Mar 2014 16:09:54 GMT
< Cache-Control: max-age=120
Cache-Control: max-age=120
< Content-Encoding: gzip
Content-Encoding: gzip
< Last-Modified: Wed, 05 Mar 2014 20:40:48 GMT
Last-Modified: Wed, 05 Mar 2014 20:40:48 GMT
< ETag: "34685bc45353d1030d3a515ddba78f3e"
ETag: "34685bc45353d1030d3a515ddba78f3e"
* Server AmazonS3 is not blacklisted
< Server: AmazonS3
Server: AmazonS3
< Age: 4244
Age: 4244
< X-Cache: Hit from cloudfront
X-Cache: Hit from cloudfront
< Via: 1.1 4f672256eaca5524999342dc8678cdd2.cloudfront.net (CloudFront)
Via: 1.1 4f672256eaca5524999342dc8678cdd2.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: h4TEULH44TCi7m2lL42A8lO-5-Gmx8iY2M2C1AOmRlK543zFN6jCtQ==
X-Amz-Cf-Id: h4TEULH44TCi7m2lL42A8lO-5-Gmx8iY2M2C1AOmRlK543zFN6jCtQ==

<
* Connection #0 to Host wikichen.is left intact

Puis échoue sur d'autres pages:

$ curl -i -v https://wikichen.is/writing/index.html
* Adding handle: conn: 0x7fa153804000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7fa153804000) send_pipe: 1, recv_pipe: 0
* About to connect() to wikichen.is port 443 (#0)
*   Trying 54.230.140.160...
* Connected to wikichen.is (54.230.140.160) port 443 (#0)
* TLS 1.2 connection using TLS_RSA_WITH_RC4_128_MD5
* Server certificate: www.wikichen.is (6w984WNu7vM5OrdU)
* Server certificate: StartCom Class 1 Primary Intermediate Server CA
* Server certificate: StartCom Certification Authority
> GET /writing/index.html HTTP/1.1
> User-Agent: curl/7.30.0
> Host: wikichen.is
> Accept: */*
>
< HTTP/1.1 502 Bad Gateway
HTTP/1.1 502 Bad Gateway
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 472
Content-Length: 472
< Connection: keep-alive
Connection: keep-alive
* Server CloudFront is not blacklisted
< Server: CloudFront
Server: CloudFront
< Date: Sun, 09 Mar 2014 17:54:41 GMT
Date: Sun, 09 Mar 2014 17:54:41 GMT
< Age: 6
Age: 6
< X-Cache: Error from cloudfront
X-Cache: Error from cloudfront
< Via: 1.1 9096435f28f91f92bacdf76122de09ee.cloudfront.net (CloudFront)
Via: 1.1 9096435f28f91f92bacdf76122de09ee.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: iAUOQbP8O4A0pI9KGvVz0VgBT1TW-j0yVDa7vdSvIAuxnKOyQghtnw==
X-Amz-Cf-Id: iAUOQbP8O4A0pI9KGvVz0VgBT1TW-j0yVDa7vdSvIAuxnKOyQghtnw==

<
<!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>
* Connection #0 to Host wikichen.is left intact
</BODY></HTML>%

J'adorerais des indications sur le point de départ du dépannage.

22
wikichen

Un représentant du nom de Alastair @ AWS des forums AWS CloudFront a résolu ce problème pour moi: 

J'ai identifié votre distribution CloudFront et le compartiment S3 agissant en tant qu'origine pour cette distribution. 

Je peux recréer et expliquer le «502 Bad Gateway» intermittent réponse que vous recevez. 

Cette réponse est renvoyée par CloudFront lorsque vous essayez d'accéder à un fichier URL utilisant le protocole HTTPS qui n'est pas actuellement mis en cache par CloudFront. La raison de cette erreur est que CloudFront tente d’essayer contactez votre Origin à l’aide du protocole HTTPS, qui échoue. 

La raison de cet échec est que vous avez configuré votre origine en tant que Seau, mais vous utilisez le type "Origine personnalisée" et dirigez-vous vers l'URL du site Web S3 pour ce compartiment. Si vous essayez de frapper votre S3 URL du site Web en utilisant HTTPS, vous remarquerez que cela ne fonctionne pas. Site Web S3 L'hébergement ne prend en charge que la fourniture de contenu à l'aide du protocole HTTP. ( http://docs.aws.Amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff ).

Maintenant, le comportement de chargement de page intermittent que vous voyez est dû à CloudFront renvoyant les pages qu'il a actuellement dans son cache. Vous devrait être capable de recréer ce scénario comme suit:

  1. Hit une page sur votre site en utilisant HTTPS. Vous devriez obtenir une erreur '502 Bad Gateway'. 
  2. Hit la même page en utilisant HTTP. Vous devriez voir la page. 
  3. Hit la page à nouveau en utilisant HTTPS. Vous devriez maintenant obtenir le résultat attendu, car CF a diffusé le contenu à partir de son cache plutôt que tenter de contacter votre origine. 

Pour résoudre ce problème, essayez ce qui suit:

  1. Ouvrez la console de gestion CloudFront et ouvrez votre distribution. 
  2. Accédez à l'onglet Origines, sélectionnez votre origine et cliquez sur "Modifier"
  3. Modifiez la "Politique de protocole d'origine" sur "HTTP uniquement". 
  4. Enregistrez les modifications et attendez environ 15 minutes pour que les modifications prennent effet. 
  5. Tester

Mon attente est que cela forcera CloudFront à contacter votre Origin en utilisant uniquement HTTP. J'ai testé cela dans mon environnement avec un S3 Un seau hébergé sur un site Web et je peux charger avec succès du contenu via les deux. HTTP et HTTPS.

Voici le lien vers le fil de discussion original .

53
wikichen

J'ai eu un problème similaire à celui-ci et, comme @ Michael-sqlbot l'a suggéré, je suis passé de Custom Origin à S3. Cela n'a pas, en soi, résolu le problème.

En plus de changer d’origine, Andrew, du support AWS, a déclaré que les alias fonctionnaient mieux que les CNAME. J'utilisais des CNAME. Quand je suis passé aux alias (un pour IPv4 et un pour IPv6), cela a fonctionné. Voici la documentation de Route 53 pour CloudFront qui explique comment configurer des alias pour CloudFront.

0
Forest J. Handford