33 votes

Heroku SSL sur le domaine racine

J'essaie de configurer SSL pour mon application Heroku. J'utilise le module complémentaire SSL basé sur le nom d'hôte. L'application heroku documentation déclare ce qui suit :

Hostname based SSL will not work with root domains as it relies on CNAME 
aliasing of your custom domain names. CNAME aliasing of root domains is 
an RFC violation. 

Comme prévu, tout fonctionne bien lorsque j'accède au site à l'aide de l'interface de l'utilisateur. www sous-domaine, c'est-à-dire https://www.foo.com . Le navigateur se plaint lorsque j'accède à https://foo.com car le certificat présenté est pour heroku.com.

J'en ai conclu que je devais rediriger le trafic pour foo.com à www.foo.com pour aborder cette question. J'envisage les approches suivantes :

1) Redirection basée sur le DNS

Le fournisseur de DNS Zerigo soutient le site rediriger des dossiers. Je suis tombé sur un question sur un sujet similaire sur SO. J'ai essayé la solution, elle ne fonctionne QUE pour la redirection HTTP (la documentation de Zerigo le confirme).

Ma configuration Zerigo :

foo.com      A             x.x.x.x
foo.com      redirect      http://www.foo.com
www.foo.com  CNAME         zzz.amazonaws.com

2) Redirection basée sur les baies

Ajouter un middleware basé sur le rack pour effectuer la redirection. Le site hôte canonique gem fournit un tel support.

use CanonicalHost do
  case Rails.env.to_sym
    when :staging     then 'staging.foo.com'
    when :production  then 'www.foo.com'
  end
end

Je me demande s'il n'y a pas une meilleure solution pour cela (à moins de passer à un SSL IP à 100 $ par mois).

41voto

Brian Armstrong Points 8259

Wow...cela m'a pris une éternité, et un tas d'informations sur le web étaient fausses. Même la documentation de Heroku ne semblait pas indiquer que c'était possible.

Mais la réponse de Jesper J. fournit un indice dans la bonne direction : cela fonctionne avec l'enregistrement ALIAS de DNSimple qui, je suppose, est une nouvelle sorte d'enregistrement DNS qu'ils ont créé. J'ai dû passer mon service DNS chez eux pour obtenir ce type d'enregistrement (j'étais auparavant chez EasyDNS).

Pour clarifier, quand je dis "travaux" je veux dire :

  • tout le site sur SSL en utilisant votre domaine racine
  • pas d'avertissement du navigateur
  • en utilisant l'offre Endpoint SSL de Heroku (20 $/mois)

Il fonctionne pour tous des urls suivantes (les redirige vers https://foo.com sans aucun avertissement)

Pour résumer les points importants.

  1. déplacer votre DNS vers DNSimple (si quelqu'un connaît d'autres fournisseurs offrant un enregistrement ALIAS, veuillez les poster dans les commentaires, c'est le seul que j'ai pu trouver).
  2. configurer le point de terminaison Heroku ssl comme d'habitude https://devcenter.heroku.com/articles/ssl-endpoint
  3. Dans DNSimple, ajoutez un ALIAS pointage de disques foo.com à votre point de terminaison ssl heroku, quelque chose comme waterfall-9359.herokussl.com
  4. Ajoutez également un enregistrement CNAME pointant www.foo.com à votre point de terminaison heroku ssl, waterfall-9359.herokussl.com
  5. enfin dans votre application rails (ou autre) faites les réglages suivants :

sur production.rb set

config.force_ssl = true

sur application_controller.rb ajouter

before_filter :check_domain

def check_domain
  if Rails.env.production? and request.host.downcase != 'foo.com'
    redirect_to request.protocol + 'foo.com' + request.fullpath, :status => 301
  end
end

Cela semble enfin fonctionner ! La pièce clé semble être le ALIAS enregistrement DNS. Je serais curieux d'en savoir plus sur son fonctionnement si quelqu'un le connaît, et sur sa fiabilité/maturité. Il semble cependant faire l'affaire.

2 votes

Heroku dit ici que "Vous devez saisir un sous-domaine dans le champ "Nom d'hôte"", car un certificat de domaine racine n'est pas compatible avec le point de terminaison SSL de Heroku. Avez-vous créé un certificat de domaine racine ou quelque chose comme secure.foo.com ? Et cela affecte-t-il le request.host vérifier l'intérieur check_domain ?

1 votes

Pouvez-vous confirmer s'il est réellement possible d'utiliser un certificat racine ?

0 votes

J'ai utilisé un certificat Root. J'ai envoyé un e-mail au support Heroku et ils m'ont dit que c'était ce que les gens faisaient, et que cela semblait fonctionner avec un enregistrement ALIAS de Dnssimple. Mais ils ne veulent pas cautionner un fournisseur de services DNS en particulier et cela ne figure pas dans la documentation officielle. Ce serait bien s'ils ajoutaient quelque chose dans la documentation ou ici. Il peut y avoir d'autres implications sur les performances dont je ne suis pas conscient, donc je serais curieux d'en entendre plus sur ce sujet de leur point de vue.

8voto

Jesper J. Points 768

DNSimple propose un type d'enregistrement ALIAS pour répondre à ce besoin. Vous pouvez créer un alias de votre domaine racine (a.k.a zone apex) pointant vers un CNAME. Pour en savoir plus, cliquez ici :

http://blog.dnsimple.com/introducing-the-alias-record/

1voto

John Beynon Points 23163

Les redirections DNS ne se soucient pas de savoir si la demande entrante est http ou https et conservent donc le protocole d'origine - de même que la redirection. http://foo.com à http://www.foo.com et la même chose pour https.

Vous devrez le faire dans l'application via la gemme que vous avez trouvée ou une autre gemme de redirection de rack ou si www. est un problème, utilisez l'addon SSL basé sur l'IP.

0 votes

Selon la documentation de Zerigo, la redirection DNS ne fonctionne QUE pour http. zerigo.com/blog/2009/07/ . Ma solution finale sera un mélange de deux styles.

1voto

Une chose que vous devez garder à l'esprit est que Google pourrait indexer les deux versions de votre site si les deux versions sont accessibles (Root vs WWW). Vous devrez configurer des coniques pour gérer cela, ce qui peut être pénible à entretenir.

Dans mes paramètres DNS, j'ai configuré un enregistrement URL / Forward (DNS Simple).

URL foo.com     3600        http://www.foo.com

La configuration du CNAME ne doit être configurée que pour le WWW.

CNAME   www.foo.com 3600        providedsslendpoint.herokussl.com

J'ai également dû configurer un alias pour ma racine.

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

J'ai alors décidé de remplacer simplement foo.com avec une variable env. ENV['SITE_HOST'] (où SITE_HOST= www.foo.com ou ce que je pourrais définir). Je peux contrôler cela via ma configuration heroku ou mon fichier .env (Voir https://github.com/bkeepers/dotenv ). De cette façon, je peux contrôler ce qui se passe dans différents environnements.

Par exemple, mon application de test utilise test.foo.com comme url, il a également son propre point de terminaison SSL, ce qui fonctionne bien pour moi. Cela permet également de créer des environnements spécifiques à la mise en place ou à l'assurance qualité.

  before_filter :check_domain

  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

À partir de maintenant, les utilisateurs finaux accéderont toujours au site www avec un SSL forcé. Les anciens liens souffriront d'un léger blocage, mais rien de notable.

1voto

Arthur Corenzan Points 303

Dans la partie Rails, pour faire la redirection, il serait plus raisonnable de la faire se produire sur la couche routeur, comme ceci (fonctionne sur Rails 3+) :

Rails.application.routes.draw do

  match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' }

  # ...

end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X