L’installation d’un certificat SSL sur une plateforme en Drupal hébergé en Simple Hosting chez Gandi

Edit du 18 septembre 2016 : Le présent billet a fait l'objet d'une mise à jour des informations.

Vous avez été plusieurs à me dire que pour un site qui prétend causer technique et sécurité, ce n’était pas normal qu’une connexion en HTTPS ne soit pas effective et c’est vrai. Faute de temps, je ne l’avais pas mise en place. 

Récemment, j’ai eu plus de temps et je profite d’en avoir quasiment fini avec ce qui s’est avéré être un peu difficile pour moi, pour faire un retour d’expérience.

Par ailleurs, Google a annoncé que les sites qui ne présenteraient pas une alternative HTTPS seraient pénalisés en terme de référencement, on a donc tout intérêt à s'y mettre. 

Postulat de base : à la suite d’une commande, je devais monter une plateforme, dont la connexion se ferait entièrement en HTTPS. Evidemment, j’ai utilisé mon CMS de prédilection, à savoir Drupal, la septième version, que j’ai hébergé sur mon instance Gandi en Simple Hosting taille M. Ce retour d'expérience s'adresse donc aux personnes qui sont chez Gandi, y dispose un Simple Hosting et souhaite rendre disponible leur site en HTTPS. 

Première étape : création et activation du certificat SSL.

Pour qu’un site puisse être accessible en HTTPS, il faut acquérir et activer un certificat SSL. SSL est l’acronyme de Secure Sockets Layer et cela permet d’authentifier le serveur et de sécuriser les données. Concrètement, si vous vous connectez sur un site entièrement en HTTPS, même si vous êtes sur une connexion partagée – cas des hotspots WiFi – les éventuelles attaquants ne pourront pas voir ce que vous échangez avec et sur la plateforme car tout sera chiffré.

Chez Gandi, sur les instances Simple Hosting, à partir du pack M, vous pouvez bénéficier gratuitement d’un certificat SSL pendant un an. On se rend donc sur son interface-client, puis dans la liste des domaines achetés. A côté de chaque nom de domaine, vous avez un cadenas, une enveloppe et un écrou.  Vous allez d'abord cliqur sur l'enveloppe, qui vous permettra de  créer une adresse email en admin@mondomaine.truc. Une fois que cela est fait, vous retourner sur la page des noms de domaine. Vous cliquez sur le cadenas et une nouvelle page s'ouvre. Sur cette page, vous avez un bouton "acheter un certificat SSL". Vous choississez le certificat qui vous convient et vous allez obtenir une page "achat d'un certificat SSL" avecun espace CSR. En-dessous de cet espace, vous avez une ligne qui vous propose d'utiliser le générateur de Gandi. Il s'agit du générateur de CSR sous OpenSSL. Remplissez les champs obligatoires et optionels et vous obtiendrez une ligne de commande.

 

Générateur

Que faire ensuite ? Si vous êtes Linuxien, un petit Ctrl+Alt+T et un copier-coller de la ligne obtenue. 

terminal_openssl.jpgterminal open SSL

L’opération terminée, rendez-vous dans le dossier dans lequel les deux fichiers textes ont été générés. Au pire, faites une recherche avec le nom du domaine concerné.

les fichiers SSL

Et si vous êtes Windowsien ? Je vous déconseille d’utiliser l’outil proposé par Gandi car il vous faudra télécharger un grand nombre de choses et perdre du temps. Comment faire alors ? Vous avez deux options : passer par un live CD ou créer ou utiliser une de vos machines virtuelles. Dans les screenshots que vous voyez, je suis passée par une machine virtuelle en session invitée et comme vous le constatez, une Ubuntu fait très bien l’affaire.

Nous avons généré les fichiers demandés, il faut simplement les copier-coller. Ouvrez le fichier se terminant par .csr et copiez-collez le contenu dans la case certificat. Ouvrez le fichier se terminant par key et copiez-collez le contenu dans la case clé privée. On clique ensuite sur valider.

On vous demandera ensuite de choisir votre méthode de validation : soit par validation DNS, soit par email soit en plaçant un fichier dans votre htdocs. Si vous ne vous sentez pas suffisamment à l’aise ou que vous avez peur de faire une erreur, choisissez la validation par email. J’ai testé les trois possibilités et c’est la validation par email qui m’a paru la simple. Pour procéder à la validation par email, l’adresse à indiquer doit impérativement être en « admin » et c’est pour cela que nous avons commencé par créer cette boîte email.  

Vous recevrez alors le mail suivant :

Mail de validation

Pas de panique si cela met un peu de temps avant d’arriver.

Suivez les instructions et attendez. Vous recevrez alors un autre mail, sur la boîte liée à votre compte client chez Gandi, qui ressemblera à ceci :

Activation SSL

Il ne vous reste plus qu'à installer le certificat sur votre instance. Rendez-vous dans votre espace Simple Hosting, section "sites". Avisez le cadenas, cliquez dessus et renseignez les champs. Le certificat se trouve dans votre espace SSL et la clef privée est le fichier .key que vous avez généré sur votre ordinateur. 

 

On résume et dans le bon ordre :

  1. Connexion à votre espace client ;
  2. Création d’une boîte mail admin@mondomaine.truc ;
  3. Activation du certificat SSL ;
  4. Génération de la ligne de commande openssl ;
  5. Ouverture d’une machine virtuelle ou utilisation d’un live CD Linux ;
  6. Génération du certificat SSL grâce à un terminal sous Linux ;
  7. Copier-coller des informations dans les cases appropriées ;
  8. Validation ;
  9. Attente ;
  10. Réception du message de confirmation de l’activation de votre certificat.
  11. Installation du certificat sur Simple Hosting.

 

 

Vous êtes arrivé jusqu’à là ? Félicitation, vous avez fait la moitié du job. Passons à Drupal.

Seconde étape : la configuration de Drupal

Par défaut, Drupal s’installe en http et est accessible uniquement en http. Il est possible de faire en sorte que votre plateforme soit « full HTTPS ». Mais il n’est pas possible de faire un mix et de laisser le choix à vos internautes. Pourquoi cela ? Les appels aux fichiers se font soit en HTTP soit en HTTPS mais cela n’est pas changeable en fonction de l’option choisie par l’internaute. Le sous-entendu est simple : certaines plateformes construites avec Drupal qui se targue de laisser le choix ou d’avoir un mélange des deux ne sont en fait pas sécurisées.

Peut-on recourir à un module quelconque pour que la connexion en HTTPS se fasse ? Théoriquement oui, en pratique, cela a surtout cassé ma plateforme car la version adaptée à ma version de Drupal est toujours en phase de développement et il faut patcher soi-même le module. Délicat quand on est développeur à la souris et carrément déconseillé quand on ne maîtrise pas le développement.

Que faire alors ? Après tout si je vais sur la page d’accueil de ma plateforme qui possède son petit certificat, ma page d’accueil est tout propre. Mais si je vais ailleurs, voilà ce qui se passe :

Drupal nu

Et pourquoi ? Regardons le code-source.

Comme les fichiers et modules sont appelés en HTTP et non en HTTPS, leur affichage est bloqué.

A partir de là, on ouvre son client FTP et on se rend dans www.mondomaine.truc => htdocs => site => default => settings.php

Les fichiers

Avant de modifier le fichier, on fait un clic droit dessus, on sélectionne « droits d’accès au fichier »  et on vérifie qu’on possède bien les droits de lecture, d’écriture et d’exécution en cochant les cases. Ensuite, on ouvre son fichier settings.php, avec Notepad par exemple, et on file à la ligne 281.

Par défaut, voici ce que vous avez :

HTAccess par défaut

Voici ce que vous devez écrire à la place :

Forcer le https

Concrètement, vous supprimez l’espace et le croisillon devant le $base_url, et toujours entre guillemets (‘’) vous inscrivez https://www.mondomaine.truc.

Que vient-on de faire ? Simplement de dire à Drupal que la base des URL du site était HTTPS et non HTTP.

Vous chargez votre fichier, vous vous rendez dans votre instance Gandi => Simple Hosting => Administration de votre instance, vous purgez le cache Varnish, ensuite, dans la section PHP, vous cliquez sur APC, cliquez sur Clear opcode Cache.

Ensuite, sur votre plateforme, vous vous rendez dans configuration => Performance => Effacer tous les caches puis configuration => Cron => Lancer la tâche planifiée (Cron).

Donc, en résumé :

  1. Ouvrir son client FTP ;
  2. Repérer le fichier settings.php ;
  3. Vérifier les droits d’accès au fichier et les changer si besoin est ;
  4. Modifier la ligne $base_url ;
  5. Enregistrer et charger le fichier modifié ;
  6. Vider le cache Varnish ;
  7. Vider le cache APC ;
  8. Vider le cache de Drupal ;
  9. Lancer une tâche Cron.

C’est terminé, votre site a désormais son HTTPS.

La plateforme qui devait être « full HTTPS » l’est effectivement. 

Je remercie grandement Ze- qui a mis son nez dedans et m’a permis de comprendre certains éléments ainsi que Karim de Gandi qui a encore une fois, perdu 1h30 au téléphone avec moi et m’a expliqué correctement et patiemment la marche à suivre.  

Commentaires

Après investigation, tests, et discussion avec Gandi, voici mes conclusions.

La configuration de Drupal présenté ici n'est utile que lorsque vous avez un site Drupal n'ayant qu'un seul nom de domaine, et qui doit avoir l'intégralité des liens en https, quelque soit la méthode d'accès.

En temps normal, Drupal détecte tout seul s'il est appelé en http ou en https, et laissera les liens dans la page dans le même protocole. Par défaut, une navigation en http restera en http, et une navigation en https restera en https.

Maintenant, dans le cas particulier du Simple-Hosting chez Gandi, il y a actuellement un bug empêchant Drupal de reconnaitre qu'il est appelé en HTTPS lorsque la page utilise du Rewrite, ce qui est le cas pour toutes les URLs autre que la home, en évitant des URLs type /index.php/mapage.

Techniquement, il devrait y avoir une variable $_SERVER['HTTPS'], mais lors d'un Rewrite, cette variable n'est pas présente, et mais il y a une variable $_SERVER['REDIRECT_HTTP'].

Gandi est au courant, c'est un bug connu et corrigé en interne. Le déploiement sur l'ensemble de leur plateforme Simple-Hosting est prévu pour "bientôt", mais la correction ayant des impacts, ils prennent du temps pour s'assurer de ne pas tout casser.

En attendant le prochain déploiement, voici 2 solutions permettant de palier ce type de bug (il n'est besoin de n'appliquer qu'une seule des proposition):

1. Ajouter dans le .htacces à la racine du site la ligne suivante:

SetEnvIfNoCase REDIRECT_HTTPS on HTTPS=on

2. Ajouter le code suivant au début du fichier index.php (après la ligne de début php):

if (array_key_exists('REDIRECT_HTTPS', $_SERVER)) {
if ($_SERVER['REDIRECT_HTTPS'] == 'on') {
$_SERVER['HTTPS'] = 'on';
}
}

L'une comme l'autre de ces options permettent de placer la variable HTTPS si la variable REDIRECT_HTTPS est présente, et donc de palier au problème spécifique présent.

Bien évidement, ce bug n'est présent dans aucune documentation, et c'est après des heures d'analyse, et une remonté dans les supports chez Gandi que l'information a pu être obtenue.

Un comportement à la base anormal de l'applicatif lié a un comportement anormal en entrée sur la configuration de l'hébergement.

Conclusion: Si vous avez un bug applicatif étrange a un endroit, pensez a le reproduire dans un environement différent afin de s'assurer de la nature du bug.

Merci copain pour cet ajout et désolée pour le robot :p 

Un autre bug que j'ai rencontré lors de mes tests: L'activation de mon certificat SSL me renvoyait systématiquement le message "La valeur saisie est incorrecte."

La page en question bug simplement s'il y a des espaces avant ou après le certificat/la clef. Un peu comme si votre copier/coller prend également une ligne vide avant de commencer, ou un retour à la ligne à la fin. Le truc classique qui m'arrive en PERMANENCE lorsque je copie/colle un texte qui fait plusieurs lignes.

Le bug est remonté, j'espère qu'il sera rapidement corrigé. En attendant, si quelqu'un tombe sur cet article/ce commentaire, et a le problème... peut-être que cela pourra aider.

Ajouter un commentaire