Introduction
Si il n’y avait jusqu’à maintenant aucune justification pour migrer un site Web du protocole HTPP vers le protocole sécurisé HTTPS avec SSL (Secure Socket Layer), ce n’est désormais plus le cas.
Pourquoi ? Au-delà de la justification d’établir des échanges réseaux sécurisés et encryptés pour se prémunir des attaques et "sniffeurs", 3 raisons motivent la migration vers HTTPS : l’indexation du site par Google, l’utilisation et les bénéfices du protocole HTTP 2 et enfin la crédibilité.
Pas à pas sont décrites ici les étapes réalisées pour migrer www.sqlpac.com vers le protocole HTTPS. L’hébergeur est ici OVH, le SSL est inclus dans l’abonnement et activé : les certificats sont délivrés par Let’s Encrypt, les renouvellements des certificats avant expiration (3 mois) sont également gérés par l’hébergeur OVH.
Un petit schéma pour comprendre comment fonctionne les certificats SSL avec Apache, un dessin vaut mieux qu’un très long laïus sur ce sujet complexe au premier abord pour un néophyte.
La mécanique technique est plus détaillée dans l’article suivant : Apache 2.4. Virtual hosts sous Windows en HTTPS / SSL avec des certificats auto signés. Création et automatisation par macro.
Pourquoi migrer vers HTTPS ?
L’indexation Google et les statistiques Google Analytics
La raison principale de migrer vers le protocole HTTPS : l’indexation par les robots de Google (SEO - Search Engine Optimization). Même si un site web ne délivre que du contenu (pas de e-commerce, de sessions, etc.), Google et son moteur de recherche adoptent désormais la position du "HTTPS everywhere by default". Les algorithmes d’indexation de Google vont progressivement délaisser les pages servies avec le protocole non sécurisé HTTP.
- Google Webmaster Blog : HTTPS as a ranking signal
- Google I/O 2014 - HTTPS everywhere (vidéo YouTube)
Une autre raison très importante liée également à Google : les référents sont bloqués par Google Analytics dans les cinématiques HTTPSHTTP. Si une page utilisant le protocole HTTP est devenue virale dans des réseaux sociaux (reddit…), réseaux sociaux qui fonctionnent avec le protocole HTTPS, ces référents sont perdus dans les statistiques Google Analytics, ils ne sont historisés que lors d’une liaison HTTPSHTTPS. La perte de ces sources d’arrivée est plutôt fâcheuse pour l’analyse de son trafic.
Gains en performances avec HTTP 2
Google a développé SPDY (Speedy), un protocole expérimental HTTP pour améliorer les performances et les lacunes de la norme HTTP 1.1, norme qui date déjà de 1995. Depuis fin 2015 HTTP/2 est arrivé, protocole essentiellement basé sur SPDY, il est supporté par le serveur Apache à partir de la version 2.4.12 et par Nginx à partir de la version 1.9.5. La majorité des navigateurs supporte le protocole HTTP 2 depuis 2017.
HTTP 2 apporte des fonctionnalités majeures qui sont source de gains en performances :
- Multiplexing et concurrence : les ressources sont chargées en parallèle via UNE seule connexion et non plus en séquentiel avec plusieurs connexions comme avec le protocole HTTP 1.1.
- Dépendances de flux : le client peut indiquer au serveur les ressources prioritaires.
- Compression des en-têtes (headers).
- Push en avance de phase : le serveur HTTP peut être paramétré pour pousser des ressources (CSS, Javascripts…) avant que le client ne les demande.
HTTPS / SSL est obligatoire pour exploiter le protocole HTTP 2.
La crédibilité
Et enfin, la dernière raison : la crédibilité.
Avec les paiements en ligne sur le web qui sont rentrés dans les mœurs, les internautes ont pour la plupart le réflexe de jeter un œuil sur la présence du cadenas garantissant le SSL et donc la sécurité dans la barre d’adresse. Et au delà du e-commerce, laisser simplement son email dans un formulaire sur un site HTTPS rassure l’internaute, d’autant plus que les navigateurs courants (Chrome, Firefox…) affichent explicitement le libellé "Non sécurisé" dans la barre d’adresse lorsque le protocole HTTP est utilisé.
Migration
Environnement de développement local
Pas question bien sur de migrer la production en direct, surtout si vous connaissez ou soupçonnez des codages en dur du protocole http:// dans des scripts Javascript, PHP… Il est tout à fait possible d’utiliser son environnement de développement local avec du HTTPS/SSL
L’article ci-dessous explique comment faire fonctionner un hôte virtuel avec Apache en local sous Windows avec du HTTPS/SSL et des certificats auto signés (self signed certificates).
Repérer et corriger tous les codages en dur http://
Avec votre éditeur préféré ou en lignes de commandes, repérer tous les codages en dur du mot clé http://
sur le site
dans les scripts PHP (*.php
, *.inc
…),
javascript (*.js
), feuilles de styles css (*.css
), etc.
find . -type f -print | xargs grep -i "http://"
... ./php/cls_gui.php:114: echo "<link rel=\"canonical\" href=\"http://"._WWW_HOST.parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH)."\">\n"; ./php/cls_gui.php:170: echo "<base href=\"http://"._WWW_HOST."/"._APP_CODE."/\">\n"; ...
Il est judicieux à présent de ne pas remplacer le codage en dur de http par un codage en dur de https, surtout si on souhaite qu’une portion du site continue à fonctionner en HTTP si HTTPS n’est plus opérationnel (expiration du certificat SSL…).
Pour les scripts PHP, selon l’agencement des classes mises en œuvre, créér une fonction globale publique appelée par exemple
f_checkHttpsProtocol
qui retourne TRUE
ou FALSE
si le protocole HTTPS est utilisé. Cette fonction envisage
tous les cas de figure en fonction de l’environnement, cette information n’est en effet pas toujours retournée avec les mêmes variables globales
d’environnement.
public function f_checkHttpsProtocol() {
if ( ! empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off')
{
return TRUE;
}
elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https')
{
return TRUE;
}
elseif ( ! empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off')
{
return TRUE;
}
return FALSE;
}
En amont des scripts PHP, une constante _HTTP_PROTO
est définie en fonction du code retour de la fonction
f_checkHttpsProtocol()
:
$https_protocol = $this->f_checkHttpsProtocol();
if ( $https_protocol ) { define("_HTTP_PROTO","https"); } else { define("_HTTP_PROTO","http"); }
Cette constante est exploitée pour ensuite éradiquer les codages en dur de http
, on remplacera
echo "<base href=\"http://"._WWW_HOST."/"._APP_CODE."/\">\n";
par :
echo "<base href=\""._HTTP_PROTO."://"._WWW_HOST."/"._APP_CODE."/\">\n";
Pour les codages en dur de http
dans les scripts Javascripts, c’est plus simple, la propriété
document.location.protocol
est à disposition. Exemple :
var hostName = "http://" + hostPrefixPages[1];
est remplacé par :
var hostName = document.location.protocol + "//" + hostPrefixPages[1];
Pour les feuilles de style, en toute logique il ne devrait pas y avoir de codage en dur dans les directives @import
, url('')
…
En principe, sauf exception, il ne devrait y avoir que les chemins absolus ou relatifs sans le protocole :
@import url(style-print.css);
background-image: url('/images/user/background_adsense.png');
Les outils de développement des navigateurs et le "Mixed Content"
Les outils de développement des navigateurs, comme celui de Chrome (Ctrl Maj I) vont être d’une aide formidable pour détecter et corriger ce qu’on appelle le "Mixed Content", c’est-à-dire une page chargée en HTTPS/SSL mais avec des ressources qui ont dû être délivrées avec le protocole HTTP (images, feuilles de style, scripts Javascripts internes ou venant de tiers comme Google, AddThis…).
Se rendre dans l’onglet "Security", et toutes les informations sont à disposition : validité du certificat, contenu mixé (mixed content), formulaire non sécurisé - non-secure form (l’action pour le formulaire appelle le protocole HTTP et non HTTPS)…
À la fin de la migration, toutes corrections effectuées : tout doit être vert !
Opérations post migration
Redirection automatique de HTTP vers HTTPS avec Apache
Rediriger ensuite automatiquement les adresses en HTTP vers les adresses HTTPS correspondantes grâce au module de réécriture des URLs
mod_rewrite
d’Apache.
Dans le fichier .htaccess
à la racine du site :
WWWROOT/.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Cette procédure implique bien sûr que l’hébergeur autorise le module de réécriture, ce qui est généralement le cas.
Cette opération est à réaliser au préalable sur l’environnement local de développement pour vérifier qu’aucune régression n’apparaît en fonction de la complexité des règles de réécriture qui peuvent éventuellement déjà exister.
Liens canoniques
Même si la réécriture des URLs de http
en https
est en place, cela n’a aucun effet sur la
définition des liens canoniques.
Donc, vérifier que les liens canoniques, très importants pour les robots Google et l’indexation, sont migrés eux aussi en HTTPS.
<link rel="canonical" href="https://www.sqlpac.com/referentiel/docs/apache-html-migration-http-https-ssl.html">
Bon nombre d’outils s’en chargent automatiquement (WordPress…), sinon vérifier ce point dans la boîte à outils PHP/Javascript utilisée.
Le fichier robots.txt
Penser à mettre à jour le fichier robots.txt
pour refléter les adresses éventuelles avec https
.
wwwroot/robots.txt
# robots.txt for https://www.sqlpac.com/
User-agent: *
Sitemap: https://www.sqlpac.com/referentiel/sitemap/sitemap-articles.xml
...
Google Search Console Site
Il faut ajouter le nouveau site https://www.sqlpac.com dans Google Search Console (anciennement Google Webmaster Tools) à partir du menu "Ajouter la propriété".
Google vérifie que vous en êtes bien le propriétaire en demandant de déposer un petit fichier HTML à la racine du site, fichier à conserver même une fois la vérification effectuée.
Resoumission des sitemaps en HTTPS
Générer les fichiers sitemaps nécessaires avec le protocole HTTPS dans les adresses.
https://www.sqlpac.com/referentiel/sitemap/sitemap-articles.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84
http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">
...
<url>
<loc>https://www.sqlpac.com/referentiel/docs/ravendb-3.4-installation-architecture-prise-en-main.html>/loc>
<lastmod>2017-09-27>/lastmod>
<changefreq>monthly>/changefreq>
<priority>0.5>/priority>
</url>
...
</urlset>
Envoyer ensuite les sitemaps dans Google Search Console Site pour le site en https. https://www.sqlpac.com Sitemaps
Il faut attendre un petit peu avant de voir les statistiques arriver.
Google Analytics
Dans le profil Google Analytics : Administration Paramètres de la propriété, définir l’URL
par défaut à https
. Aucun historique n’est alors perdu et Google Analytics reprend à partir de la migration en HTTPS.
Et les autres librairies tierces ? Google AdSense, Google Custom Search Engine, AddThis…
Pour Google Custom Search Engine, les moteurs de recherche personnalisé embarqués, depuis la version 2, le protocole https
est déjà
obligatoire (https://cse.google.com/cse.js…
).
Pour Google AdSense (publicités) et AddThis (outil de partages), rien de particulier à paramétrer dans les consoles d’administration respectives,
sauf si l’appel de ces librairies est encore effectué avec http
. Il suffit de remplacer http
par https
et ça fonctionne comme avant.
http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js |
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js |
|
http://s7.addthis.com/js/300/addthis_widget.js |
https://s7.addthis.com/js/300/addthis_widget.js |
|
http://q.addthis.com/feeds/1.0/trending.json |
https://q.addthis.com/feeds/1.0/trending.json |
Dans leur grande majorité, soit les API tierces sont déjà en https
, soit elles proposent à la fois le protocole http
et le protocole https
.
Conclusion
La migration est terminée, toutefois, surveiller pendant un laps de temps qu’il n’y a pas d’erreurs relevées dans :
- Google Analytics.
- Google Search Console (notamment les sitemaps).
Reste à vérifier si effectivement la migration en HTTPS
fait remonter les statistiques des visites, ce qui pourrait
très fortement laisser à penser que les robots Google commençaient déjà à délaisser le site en http
.
Et maintenant que le site est HTTPS/SSL, il est temps de jouer avec les nouveautés du protocole HTTP 2, si l’hébergeur l’a implémenté, mais c’est une autre page qui s’ouvre.