in google référencement certificat ssl https ~ de lecture.

Sécuriser votre site avec un certificat TLS/SSL

La mise en place d'une communication HTTPS sécurisée par TLS/SSL est la première chose qui me vient à l'esprit lorsqu'on évoque la sécurité d'un site web. L'authentification d'un certificat signée par une Autorité de certification permet à vos internautes de naviguer sur votre site en toute tranquilité, les données qui transitent entre lui et vous sont cryptées et donc hors de portée d'une attaque de type "Man In The Middle" (MITM).

L'obtention de ce certificat et son installation au niveau de votre serveur web est le sujet de ce billet :

  • StartSSL comme fournisseur TLS/SSL
  • Nginx comme serveur web

Sécurité vraiment ?

Attention, l'utilisation du protocole HTTPS répond à une partie de la sécurité d'un site web (échange de données cryptées) mais ne pourra rien faire par exemple contre :

SEO

L'enjeu SEO est à prendre aussi en considération depuis que Google offre un bonus aux sites utilisant HTTPS sur l'intégralité des pages. Pour de nombreux sites, notamment e-commerces, le référencement naturel des pages est "le nerf de la guerre" car la principale source de trafic provient des moteurs de recherche, et donc principalement de Google à plus de 95%.

Etant donné que seulement 1% des sites web proposent une navigation entièrement sécurisée (au sens HTTPS), il serait dommage de ne pas prendre au sérieux cette préconisation de Google afin de prendre un train d'avance sur la concurrence.

Secure your website

Liens intéressants :

Fournisseur SSL

StartSSL est le fournisseur que j'ai choisi pour l'obtention d'un certificat TLS/SSL signé, il est simple, efficace et l'offre est gratuite pendant 1 an, contrairement à d'autres comme NameCheap qui propose leur solution RapidSSL payante, tout en restant abordable.

Voici les étapes que j'ai suivi afin d'obtenir mon précieux certificat signé :

Cette étape permet au fournisseur de s'assurer que le nom de domaine vous appartient bien, vous devez pour cela posséder une des adresses emails ci-dessous afin de recevoir et valider l'email de validation envoyé par le fournisseur :

      - postmaster@votredomaine.tld
      - webmaster@votredomaine.tld
      - hostmaster@votredomaine.tld

Si vous ne possédez pas déjà une telle adresse, je vous invite à lire mon précédent article qui vous explique comment s'y prendre : Obtenir une adresse email personnalisée à votre nom de domaine.

  • Création de votre certificat

La génération de votre certificat se fait par le biais de l'onglet "Certificates Wizard" du site en choisissant l'option "Web Server SSL/TLS Certificate" :

  1. soit vous laissez faire StartSSL en cochant l'option "generated by PKI system" (vous obtiendrez le certificat signé (.crt) mais sans sa clé privée (.key) -> ticket au support)

  2. soit vous générez vous-même la clé privée (.key) et une demande de certificat signé (.csr) puis fournissez à StartSSL cette demande de certificat afin d'obtenir le certificat signé (.crt), voici un exemple en ligne de commande sous linux :

$ openssl req -new -newkey rsa:2048 -nodes -keyout javacube.key -out javacube.csr

J'ai personnellement opté pour le deuxième choix, étant donné que Nginx demande d'avoir physiquement la clé privée sur le serveur.

  • Etat final lorsque tout est ok

Installation du certificat

Si vous utilisez Apache comme serveur web, voici deux liens qui vous expliquent comment installer votre certificat :

La suite du billet détaille l'installation de votre certificat au niveau de Nginx, à noter qu'il faut posséder la clé privée (fichier .key) et le fameux certificat signé (fichier .crt) que vous avez obtenu précédemment.

  • Dépôt des fichiers

Créer un répertoire ssl au niveau de votre répertoire nginx, par exemple /etc/nginx/ssl, et y déposer vos deux fichiers en les nommant par votre nom de domaine pour une meilleure lisibilité : javacube.crt et javacube.key.

  • Configuration Nginx

Il faut éditer votre fichier de configuration nginx correspond à votre site, pour ma part c'est le fichier /etc/nginx/sites-available/ghost, et ajouter la partie ssl et proxy comme suit :

server {
    listen 443 ssl;
    server_name javacube.fr;
    ssl on;
    ssl_certificate /etc/nginx/ssl/javacube.crt;
    ssl_certificate_key /etc/nginx/ssl/javacube.key;
    location / {
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   Host                 $http_host;
        proxy_set_header   X-Forwarded-Proto    $scheme;
        proxy_pass         http://127.0.0.1:2368;
    }
}

puis redémarrer Nginx :

$ service nginx restart
  • Configuration ghost blog (si besoin)

Si c'est votre blog ghost que vous souhaitez "sécuriser", il faut faire en sorte qu'il se lance sur votre nouvelle url en HTTPS, il faut pour cela éditer le fichier config.js à la racine de votre blog, /var/www/ghost/config.js pour ma part :

production: {
        url: 'https://javacube.fr',
        ...
        server: {
            host: '0.0.0.0',
            port: '2368'
        }
    }

puis redémarrer ghost (le mien est configuré pour s'exécuter en production avec pm2) :

$ pm2 stop Ghost
$ NODE_ENV=production pm2 start index.js --name "Ghost"

Bonus

Pour ma part j'ai fait en sorte que les urls http://javacube.fr et http://www.javacube.fr soient redirigées vers https://javacube.fr par défaut, il faut pour cela faire deux choses :

  • Créer une redirection au niveau de votre Bureau d'enregistrement pour faire en sorte que www pointe vers non-www, voici un exemple de ce paramétrage chez Gandi :

  • Editer votre configuration Nginx comme ceci, voici mon fichier de conf au complet :
## our http server at port 80
server {
      listen 80 default;
      server_name javacube.fr www.javacube.fr;
      ## redirect http to https ##
      rewrite  ^ https://$server_name$request_uri? permanent;
}

## Our https server at port 443. You need to provide ssl config here
server {
    listen 443 ssl;
    server_name javacube.fr www.javacube.fr;

    ## redirect www to nowww
    if ($host = 'www.javacube.fr' ) {
       rewrite  ^/(.*)$  https://javacube.fr/$1  permanent;
    }

    ssl on;
    ssl_certificate /etc/nginx/ssl/javacube.crt;
    ssl_certificate_key /etc/nginx/ssl/javacube.key;
    ssl_session_timeout 5m;

    location / {
        proxy_set_header   X-Forwarded-Fort     $proxy_add_x_forwarded_for;
        proxy_set_header   X-Real-IP            $remote_addr;
        proxy_set_header   Host                 $http_host;
        proxy_set_header   X-Forwarded-Proto    $scheme;
        proxy_pass         http://127.0.0.1:2368;
    }
}

puis redémarrer Nginx :

$ nginx -s reload

Liens utiles :