wordpress en https

WordPress en https

Le protocole  HTTPS permet de crypter, donc de rendre illisible par un tiers, le contenu des échanges entre un ordinateur et un site WordPress.
Avec HTTP, un pirate surveillant votre liaison (wifi, réseau local, internet) peut aisément voir des informations sensibles : identifiants de connexion, paramétrage du site, informations bancaires… Pire, il peut modifier le contenu de la page renvoyée par le serveur pour insérer du code malveillant sans que vous vous en aperceviez.

Pour utiliser HTTPS, il faut installer un certificat électronique sur son serveur. Avec WordPress, on peut choisir de crypter les échanges :

  • dans l’administration et durant la phase de connexion (login),
  • pour l’ensemble du site,
  • ou pour certains articles et/ou pages.
Haut de page

Généralités HTTPS

Le protocole https s’appuie sur SSL/TLS (Secure Sockets Layer / Transport Layer Security) qui permet de crypter les échanges entre le navigateur de l’utilisateur et le site internet en utilisant un certificat délivré par une autorité de certification.

Il existe trois types de certificats : validation de domaine, validation entreprise et validation étendue. Le premier niveau est généralement suffisant et est le moins coûteux.

Un certificat qui s’applique sur un domaine (exemple : https://dfarnier.fr) ne s’applique pas forcément sur les sous-domaines correspondants (exemple : https://wp.dfarnier.fr).

L’installation d’un certificat sur un serveur dépasse le cadre de cet article. Normalement, les hébergeurs vous proposent de l’installer, mais ce n’est généralement pas gratuit.

Une fois le certificat installé, un outil comme permet de tester gratuitement la qualité du certificat.

Saisissez l’adresse du site et cliquez sur le bouton :

Saisir l'adresse du site à tester et cliquer sur le bouton "Submit"
Tester le certificat associé à un site internet

Dans la synthèse qui s’affiche, cliquer sur l’adresse IP (IPV6 ou IPV4) du serveur testé pour obtenir toutes les informations :

WordPress en HTTPS - Obtenir des informations sur la qualité d'un certificat SSL/TLS
WordPress en HTTPS – Obtenir des informations sur la qualité d’un certificat SSL/TLS

Dans la synthèse ci-dessus, on peut lire « Certificate not valid for domain name« .  Cela veut dire qu’il y a bien un certificat, mais il est associé à un autre nom de domaine. Dans notre exemple, nous cherchions les certificats pour le domaine « dfarnier.fr », mais le certificat trouvé est en  fait un certificat de l’hébergeur « ovh.net ».

On remarque aussi que le certificat est invalide pour l’adresse IP V6 du site, mais valide pour l’adresse IP V4.
Si vous êtes dans ce cas, je vous invite à contacter votre hébergeur, car si tous les accès via l’IPV4 vont correctement fonctionner, vous aurez des problèmes avec les accès en IPV6.

Vous pouvez aussi utiliser le site « SSL shopper »pour analyser une connexion SSL SSL Shopper :

Saisir l'adresse du site etckiquer sur le bouton "Check SSL"
Accéder à SSL Checker

Voici les informations que l’on peut obtenir :

SSL checker fournit les informations sur le certificat associé au site internet
Informations fournies par SSL checker

La connexion à un site en https

Pour se connecter à un site en utilisant le protocole HTTPSau lieu du protocole HTTP, il suffit de rajouter , dans l’adresse web (url) , la lettre « s »  à l’identifiant du protocole : « https » au lieu de « http ».

HTTP et HTTPS vont atteindre un serveur à la même adresse IP, mais le port utilisé par défaut en HTTP est le port 80, celui utilisé par défaut par HTTPS est le port 443.

Voici ce qui se passe si on se connecte à l’adresse https://dfarnier.fr avec Google Chrome avant installation d’un certificat dédié :

WordPress en HTTPS - Problème de certificat SSL
WordPress en HTTPS – Problème de certificat SSL

Le navigateur indique qu’il n’y a pas de certificat associé à l’adresse « dfarnier.fr » mais à l’adresse « xxxx.ovh.net ».
En fait, le site est installé chez l’hébergeur OVH qui fournit un certificat gratuit pour les hébergements mutualisés. Or, le certificat n’est pas associé au domaine ( ex : dfarnier.fr) mais au serveur partagé (cluster). C’est pourquoi, il faudrait accéder au site via une adresse du type : « https://xxxx.ovh.net/identifiant-ovh/ » pour pouvoir accéder au site en HTTPS.

On remarque l’icône en forme de cadenas située à gauche de l’adresse https. Elle indique l’état de la connexion https. Voici les cas possibles pour le navigateur Chrome :

WordPress en HTTPS - Connexion en https avec Chrome
WordPress en HTTPS – Connexion en https avec Chrome

Le cas des « éléments non sécurisés »sera développé plus loin dans cet article : Gérer le contenu non sécurisé. Il correspond, par exemple, à une page accédée en HTTPS mais dont les images qui s’affichent à l’intérieur de la page sont accédées en HTTP.

Haut de page

Sécuriser l’administration et la connexion au site

Les informations qu’il faudrait toujours protéger pour un site WordPress sont les données de connexion et le paramétrage de l’administration.

WordPress offre une façon simple de forcer l’utilisation de HTTPS pour ces échanges sensibles. Il suffit d’ajouter l’instruction suivant dans le fichier wp-config.php :

 define(‘FORCE_SSL_ADMIN’, true);

À partir de ce moment, si on se rend sur le site côté visiteur, donc en HTTP, on constate que WordPress a automatiquement passé l’adresse de connexion en HTTPS :

WordPress en HTTPS - Connexion forcée en https
WordPress en HTTPS – Connexion forcée en https

La page de connexion est aussi en HTTPS, ce qui veut dire que l’identifiant et le mot de passe seront envoyés au serveur sous forme cryptée :

WordPress en HTTPS - Transmission cryptée des informations de connexion
WordPress en HTTPS – Transmission cryptée des informations de connexion

Si vous saisissez dans la barre d’adresse de votre navigateur  « https://dfarnier.fr/wp-login.php », vous constaterez que vous accédez automatiquement à l’adresse « https://dfarnier.fr/wp-login.php ».

Une fois dans l’administration du site, on peut constater que WordPress a modifié les liens vers l’administration pour les mettre en HTTPS:

WordPress en HTTPS - Liens vers l'administration en HTTPS
WordPress en HTTPS – Liens vers l’administration en HTTPS

En revanche, les liens vers la partie publique du site restent en HTTP :

WordPress en HTTPS - Liens vers la partie publique en HTTP
WordPress en HTTPS – Liens vers la partie publique en HTTP

À noter : si un visiteur se connecte en HTTPS (), on constate que WordPress crée tous les liens vers le site en HTTPS ( et ) :

WordPress en HTTPS - Connexion en HTTPS : WordPress crée les liens vers le site en HTTPS
WordPress en HTTPS – Connexion en HTTPS : WordPress crée les liens vers le site en HTTPS
Haut de page

Protéger certaines pages

Outre l’administration et la connexion, certaines pages peuvent être plus sensibles que d’autres : formulaires avec des informations personnelles, commerce électronique … Par ailleurs, HTTPS ne permet pas la mise en cache, ce qui peut ralentir l’affichage notamment pour les pages contenant des images. C’est pourquoi on utilise fréquemment le HTTPS pour les seuls échanges qui ont vraiment besoin d’être sécurisés.

Méthode » WordPress »

Insérer le code suivant dans le fichier functions.php du thème ou dans une extension (plugin ou mu-plugin) :

add_action('template_redirect', 'wpdf_force_https');

 if (! function_exists ('wpdf_force_https')) {
	function wpdf_force_https() {
		if ( is_page(999) && ! is_ssl() ) {
			if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
				wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ),301 );
				exit();	//	toujours exit après une redirection
			} else {
				wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],301 );
				exit();	//	toujours exit après une redirection
			}	//	fin test structure url passée
		}	//	fin test si page en ssl
	}	//	fin fonction wpdf_force_https
}	//	fin test si fonction wpdf_force_https existe
Forcer l'affichage d'une page en HTTPS

Voici comment fonctionne ce code :

  • ajout de la fonction « wpdf_force_https » au crochet « template_redirect » qui se déclenche avant l’affichage de la page demandée,
  • lorsque WordPress passe par le crochet « template_redirect » :
    • si la page est la page d’identifiant « 999 » et que l’affichage n’est pas en ssl,
    • WordPress recharge la même page en HTTPS (y compris les éventuels paramètres situés après un « ? »).

Bien évidemment, vous remplacez la valeur « 999 » par l’identifiant de la page dont vous voulez forcer l’affichage en HTTPS.

À noter : le code ‘301’ en deuxième paramètre de la fonction « wp_redirect () » indique aux moteurs de recherche que la redirection est permanente. Ainsi, les moteurs de recherche enregistrent qu’ils doivent désormais utiliser l’adresse HTTPS à la place de l’adresse HTTP.

Rappel : pour connaître l’identifiant d’une page ou d’un article, il faut se rendre dans l’administration, afficher la liste des pages ou articles et survoler la zone d’actions proposées avec la souris. L’identifiant se trouve dans l’url (post=nnn):

WordPress en HTTPS - Retrouver l'identifiant d'une page
WordPress en HTTPS – Retrouver l’identifiant d’une page

Ne forcer que certaines pages

Si on accède côté visiteur à une page en HTTPS, on constate que WordPress a positionné certains liens en HTTPS. Or, on ne souhaite pas que ces autres pages soient accédées en HTTPS.

Voici, sous forme d’extension, une version améliorée de la fonction « wpdf_force_https () » qui :

  • force en HTTPS l’affichage de plusieurs pages ou articles dont on indique l’identifiant dans le tableau « $wpdf_pages_https »,
  • affiche en HTTP les autres pages côté visiteur.
add_action('template_redirect', 'wpdf_force_https');

if (! function_exists ('wpdf_force_https')) {
	function wpdf_force_https() {
		global $wp_query;		
		$wpdf_post_id = $wp_query->post->ID;	//	identifiant de l'article ou de la page courante
		
		// liste des identifiants d'articles ou de pages à forcer en https
		$wpdf_pages_https = array (999);

		if (! is_admin() && is_singular()){	// test si côté visiteur et page ou article unique
			if(!is_ssl()) {			// test si affichage demandé pas en ssl
			
				//	test si affichage d'une page de la liste des pages à forcer en https
				if ( in_array ($wpdf_post_id, $wpdf_pages_https) ) {
					
					if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {	//	test si 1er type d'url
						wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ),301 );	// recharger la page en https
						exit();	//	toujours exit après une redirection
					} else {		//	2eme type d'url
						wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ,301 );// recharger la page en https
						exit();	//	toujours exit après une redirection
					}	//	fin test structure url passée
				}	//	fin test si page en ssl
			} else {	//	connexion  ssl
				if ( !in_array ($wpdf_post_id, $wpdf_pages_https) ) {	//	test si page à forcer en https
					if ( 0 === strpos($_SERVER['REQUEST_URI'], 'https') ) {	//	test si 1er type d'url
						wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'http' ),301 );	// recharger la page en https
						exit();	//	toujours exit après une redirection
					} else {		//	2eme type d'url
						wp_redirect( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],301 );	//recharger la page en https
						exit();	//	toujours exit après une redirection
					}	//	fin test structure url passée
				}	//	fin test si affichage demandé en ssl ou non
			}	//	fin test si ssl
		}	//	fin test si côté visiteur et page ou article unique
	}	//	fin fonction wpdf_force_https
}	//	fin test si fonction wpdf_force_https existe
Ne forcer que certaines pages ou certains articles en HTTPS

Méthode « .htaccess »

Le fichier « .htaccess » est un fichier de configuration du serveur Apache. Si vous disposez d’un serveur différent (par exemple : nginx), vous devrez mettre en place des directives équivalentes. À noter : vous trouverez la documentation Apache sur le site officiel.

Ajouter les directives suivantes, avant les directives que WordPress a pu ajouter pour gérer les permaliens (au-dessus de « # BEGIN WordPress ») :

#forcer page "liens-utiles" en https
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} off
RewriteRule liens-utiles https://www.dfarnier.fr/liens-utiles [NC,R=301,L]
</IfModule>
Forcer des pages en HTTPS via le fichier .htaccess

Voici comment fonctionne ce code :

  • vérification si le module de redirection est actif sur le serveur Apache, si oui l’activer,
  • indiquer que les adresses dans les conditions à venir se baseront sur la racine du domaine,
  • condition : la page demandée ne doit pas être en HTTPS ,
  • si, en plus, l’adresse est « liens-utiles » alors redemander l’affichage de la page en HTTPS .

À noter : NC, R et L en fin d’instruction RewriteRule sont des « drapeaux de réécriture Apache« . « NC » indique que la casse (majuscule / minuscule) n’a pas à être prise en compte pour l’adresse testée, « R=301 » indique qu’il s’agit d’une demande de redirection permanente et « L » indique qu’il ne faut pas continuer à exécuter ce fichier .htaccess après la redirection.

Ne forcer que certaines pages

La gestion du forçage en HTTPS non souhaité des « autres pages » fait augmenter rapidement le nombre de lignes de directives à écrire dans .htaccess.
Par ailleurs,  il nous manque l’équivalent du marqueur conditionnel « is_admin() ». S’appuyer sur le fait que les url des pages sont de la forme « domaine/wp-admin/… » n’est pas une méthode garantie par WordPress. Même si vous parvenez à le faire fonctionner aujourd’hui, rien ne garantit que cela fonctionne avec de futures version de WordPress ou de nouvelles extensions (plugins).
Personnellement je déconseille d’utiliser « .htaccess » pour gérer des particularités de fonctionnement d’une application.

Haut de page

Gérer le contenu non sécurisé

Le contenu non sécurisé est du contenu (fichier image, fichier de script, fichier css…) qui est appelé en HTTP dans une page chargée en HTTPS. Du contenu malveillant peut y être inséré, qui peut permettre à un pirate d’obtenir des informations qu’on voulait lui cacher en utilisant HTTPS.

Les navigateurs informent le visiteur que la protection n’est pas complète en affichant une icône particulière dans la barre d’adresse. Avec Google Chrome :

 : correspond à une page totalement chargée en HTTPS,

  : correspond à une page chargée en HTTPS mais avec du contenu chargé en HTTP.

Pour corriger, il faut d’abord repérer quel contenu n’est pas sécurisé sur une page. On peut analyser le source de la page, mais le navigateur Google Chrome offre un outil bien plus pratique qui liste automatiquement le contenu non sécurisé.

Appuyer sur la touche F12 (sous Windows) pour faire apparaître l’outil de développement.

Afficher la page à analyser. Cliquer sur l’onglet  puis sur l’icônepour retirer les informations qui ne s’appliquent pas forcément à la page qu’on veut étudier..

WordPress en HTTPS - la console Google Chrome
WordPress en HTTPS – la console Google Chrome

Recharger la page () et analyser les informations qui s’affichent dans la console :

WordPress en HTTPS - Affichage du contenu non sécurisé dans une page en https
WordPress en HTTPS – Affichage du contenu non sécurisé dans une page en https

En modifiant les liens vers les images dans la page et dans le widget, on obtient une image garantie totalement sécurisée pour le visiteur :

WordPress en HTTPS - Page totalement sécurisée
WordPress en HTTPS – Page totalement sécurisée

Pour modifier les liens dans une page ou un article, le plus rapide est de cliquer sur l’onglet

 et d’ajouter le « s » pour « https » dans les liens :

WordPress en HTTPS - Modifier un lien dans le texte d'une page ou d'un article
WordPress en HTTPS – Modifier un lien dans le texte d’une page ou d’un article
Haut de page

Forcer tout le site en HTTPS

Dans l’administration, modifier les adresses de WordPress et du site en remplaçant « http » en « https » :

WordPress en HTTPS - Modifier les adresses WordPress et du site
WordPress en HTTPS – Modifier les adresses WordPress et du site

Une fois ce paramétrage validé, WordPress modifie tous les permaliens pour les passer en HTTPS :

WordPress en HTTPS - Site WordPress forcé en HTTPS
WordPress en HTTPS – Site WordPress forcé en HTTPS


Si vous avez fait une erreur de saisie et que le site ne fonctionne plus, vous pouvez corriger le problème en insérant le code suivant dans le fichier « wp-config.php » :

DEFINE (‘WP_HOME’,’https://www.dfarnier.fr’);
DEFINE (‘WP_SITEURL’,’https://www.dfarnier.fr’);

À noter : tant que ces lignes sont présentes dans le fichierwp-config.php, vous ne pouvez-plus modifier via l’administration (Réglages généraux).

Vous pouvez ensuite vous connecter à l’administration pour corriger l’erreur de saisie, puis retirer les deux lignes insérées dans wp-config.php.

Autre solution : modifier directement les champs « siteurl » et « homeurl » dans la base de données WordPress.

Gérer le contenu non sécurisé

Les pages et articles sont désormais affichés en HTTPS, mais par leur contenu. Les navigateurs font apparaître que certaines pages ne sont pas totalement sécurisées. Le mieux est d’intervenir directement dans la Base de Données WordPress (après avoir fait une sauvegarde, bien entendu).

Voici une requête SQL, qui modifiera le contenu des articles et pages et forcer en HTTPS tous les liens internes au site (« https://dfarnier.fr » => « https://dfarnier.fr » et « https://dfarnier.fr » => « https://www.dfarnier.fr »).

UPDATE wp_posts SET post_content = REPLACE(post_content,'http://dfarnier.fr/mon/contenu/','https://dfarnier.fr/mon/contenu/');
UPDATE wp_posts SET post_content = REPLACE(post_content,'http://www.dfarnier.fr/mon/contenu/','https://dfarnier.fr/mon/contenu/');
Mettre en https les urls internes dans la table wp_posts

Pour exécuter la requête SQL :

  1. se connecter à phpMyAdmin,
  2. sélectionner la table wp_posts (ou équivalent si le préfixe a été modifié),
  3. cliquer sur l’onglet 
  4. saisir la requête ci-dessus dans la zone de saisie.
WordPress en HTTPS - saisir une requête SQL
WordPress en HTTPS – saisir une requête SQL

 

WordPress en HTTPS - oRequête SQL dans PHPMyAdmin pur passer le contenu en HTTPS
WordPress en HTTPS – Requête SQL dans PHPMyAdmin pour passer le contenu en HTTPS

Forcer l’accès en HTTPS

L’administration et la connexion (login) s’effectuent automatiquement en HTTPS, même si on n’a pas forcé la constante  ‘FORCE_SSL_ADMIN’dans le fichier wp-config.php ( define(‘FORCE_SSL_ADMIN’, true ). En revanche, il est toujours possible d’accéder au site en HTTP côté visiteur. Ceci peut se produire si les visiteurs et/ou les moteurs de recherche ont enregistré des adresses avant la bascule du site en HTTPS.

Le code suivant permet de rediriger en HTTPS tout accès en HTTP, tout en l’indiquant aux moteurs de recherche (utilisation du paramètre ‘301’ dans la fonction wp_redirect()  ) :

 
add_action('template_redirect', 'wpdf_force_site_https');

if (! function_exists ('wpdf_force_site_https')) {
	function wpdf_force_site_https() {
		if(!is_ssl()) {			// test si affichage demandé pas en ssl
			if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {	//	test si 1er type d'url
				wp_redirect( set_url_scheme( $_SERVER['REQUEST_URI'], 'https' ),301 );	// recharger la page en https
				exit();	//	toujours exit après une redirection
			} else {		//	2eme type d'url
				wp_redirect( 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301 );// recharger la page en https
				exit();	//	toujours exit après une redirection
			}	//	fin test structure url passée
		}	//	fin test si ssl
	}	//	fin fonction wpdf_force_site_https
}	//	fin test si fonction wpdf_force_site_https existe
Supprimer l'accès au site en HTTPS

Mettre à jour Google Analytics

Si vous utilisez Google Analytics, n’oubliez pas de le mettre à jour :

WordPress en HTTPS - Mettre url en HTTPS dans Google Analytics
WordPress en HTTPS – Mettre url en HTTPS dans Google Analytics

Conséquences sur les extensions (plugins)

La plupart des extensions continueront à fonctionner normalement.

Certaines extensions peuvent ne plus fonctionner correctement. Souvent, il suffira de les désactiver (pas les supprimer) puis de les réactiver pour que les problèmes disparaissent.

N’hésitez pas à vérifier le paramétrage de vos extensions, il faut parfois forcer certains choix en HTTPS plutôt que HTTP (notamment pour les extensions de référencement).

Avertissement : Avant de basculer votre site en HTTPS, vous pouvez tester avec le Debugger Facebook. Si vous obtenez ce type de message d’erreur, c’est qu’il y a le problème de certificat évoqué plus haut (valide sur l’IPV4 mais invalide sur l’IPV6) :

Soit vous avez installé vous-même votre certificat, et il vous faut compléter l’installation. Soit vous avez fait appel à un hébergeur pour l’installer, et il vous faut le contacter pour qu’il corrige le problème.

Modifier htaccess

Il est possible d’inclure le code suivant dans le fichier.htaccess pour rediriger touts les accès en HTTP (rappel , le protocole HTTP utilise par défaut le port 80), vers la même adresse en HTTPS :

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.domaine.com/$1 [R,L]
Code dans .htaccess pour rediriger en HTTPS

Ce code fonctionne, mais il agit sur l’ensemble du domaine et de ses sous-domaines (le fichier .htaccess agit au niveau du répertoire où il est installé et de tous les sous-répertoires). On peut affiner les redirections, mais cela alourdit le code à créer et complexifie la maintenance du site.

Par ailleurs, il y aura une redirection pour tous les appels : la page à afficher et notamment toutes les images contenues dedans. Cela va dégrader le temps d’affichage, paramètre sensible tant pour les utilisateurs que les moteurs de recherche.

Il est important de connaître les possibilités offertes par le fichier .htaccess (ou son équivalent pour un autre serveur web), mais pour gérer WordPress, je préfère utiliser au maximum les procédures disponibles avec WordPress. Cela ne viendra pas perturber d’autres applications installées sur le même serveur et cela restera pérenne : même si WordPress évolue, cela continuera à fonctionner.

Haut de page

Une réflexion sur « WordPress en https »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.