HTTPS, SSL, Nginx, CloudFront

0 Flares 0 Flares ×

Si vous cherchez à implémenter HTTP Secure (HTTPS) sur votre site utilisant un serveur Nginx, voila un petit guide.

Pour plus de détails sur HTTPS je vous renvoie à la page Wikipedia sur HTTPS. En gros, Cela permet de chiffrer les échanges avec SSL, TLS entre le serveur et le navigateur du client. En utilisant HTTP, tous les échanges se font en clair, donc si quelqu’un écoute ce qui se passe sur le réseau, il peut choper tout ce qu’il veut, dont vos mots de passe.

Par exemple, c’est recommandé sur un site de vente en ligne et tous les sites qui gèrent des informations un peu sensible, comme des accès aux comptes twitter, facebook, …, des forums. Sinon, on peut facilement usurper votre identité et publier des messages à votre place.

Certificat SSL

Pour que votre serveur puisse proposer du HTTPS, il vous faut un certificat d’authentification permettant de chiffrer les échanges. Ce certificat, permettra également de vérifier l’identité de votre site web.

Il existe plusieurs type de certificat. Rien ne vous empêche de le faire vous même, en 3 commandes, sous Linux :

# créer une clé privée
openssl genrsa -out bibichette.key 2048
# Créer un CSR (Certificate Signing Request) :
openssl req -new -key bibichette.key -out bibichette.csr
# créer le CRT d'après la clé privée et le CSR :
openssl x509 -req -days 365 -in bibichette.csr -signkey bibichette.key -out bibichette.crt

ou en 1 seul commande :

openssl req -days 365 -new -newkey rsa:2048 -nodes -keyout bibichette.key -out bibichette.csr

Ce certificat permettra de chiffrer les échanges, mais comme ce certificat n’est pas émis par une autorité faisant partie de la liste blanche des navigateurs, vous aurez un bel avertissement à l’ouverture de votre page expliquant que c’est dangereux, … Donc c’est utile dans un contexte de développement, de test ou dans un environnement connu comme un intranet, mais pas vraiment envisageable pour un site de vente en ligne, ou autre.

Il faudra alors sortir le porte monnaie et acheter un certificat auprès d’une autorité compétente. Il y en a beaucoup, avec des prix très variables suivant le type de certificat dont vous avez besoin.

Il existe différents types de certificat :

  • DV (domain validated) : c’est le plus simple, et le moins cher. Il permet juste de valider le domaine sur lequel se trouve le site. Il est rapide à obtenir. Ca sécurise les échanges mais on ne sait pas avec qui.
  • OV (organization validated) : il permet de valider votre organisation et votre domaine. Il faut envoyer des documents prouvant que vous êtes bien le propriétaire du domaine et pour valider votre entreprise. ce certificat et plus long à obtenir, et plus cher, mais permet d’indiquer à l’internaute à qui appartient réellement le site.
  • EV (extended validated) : celui là va vous couter un bras, il est assez long à obtenir, car des vérifications plus poussées sont réalisées. Mais c’est ce certificat qui apporte le plus de sécurité aux internautes.

Ensuite le prix varie également en fonction du domaine d’application. Le certificat peut être utilisé sur :

  • un seul domaine ($) (certains propose automatiquement avec le www et sans)
  • wildcard ($$) : qui permet d’utiliser le certif sur plusieurs sous domaines : www.monsite.com, api.monsite.com, shopping.monsite.com
  • multi domaine ($$$) : utilisable sur plusieurs domaines différents

Mise en place d’un certificat DV sur un serveur Nginx

Obtenir son certificat

Il va falloir sur votre serveur, créer un CSR (Certificate Signing Request), avec openssl installé :

openssl req -nodes -newkey rsa:2048 -keyout bibichette.key -out bibichette.csr

Il va vous poser des questions, il faudra répondre :) Il faudra mettre votre nom de domaine dans Common Name (eg, YOUR name) []: www.bibichette.com

Cette commande va générer 2 fichiers : bibichette.key qui est la clé privée (à mettre à l’abri) et bibichette.csr

Acheter votre certificat

Vous avez le choix. Il faut regarder notamment le pourcentage associé à la reconnaissance du navigateur et le prix.

Il existe des fournisseurs gratuits comme StartSSL. J’ai personnellement utilisé des certificats de CheapSSL à 5 $ par an, qui fonctionne sans problème.

Récupération et mise en place du CRT

Les procédures seront certainement différentes suivant le fournisseur.

Une fois acheté, il faudra fournir différentes infos sur le domaine, ainsi que le fichier CSR que vous avez généré. Ils vont générer le certificat rapidement et vous envoyer ça par mail avec 2 autres fichiers CRT : un certificat Intermediate,
et un certificat Root

Il va falloir concaténer ces certificats en 1 seul :

cat bibichette.crt intermediate.crt root.crt > bibichette-bundle.crt

ensuite copier le fichier KEY ainsi que le CRT dans un endroit accessible uniquement à l’utilisateur Nginx.

sudo chown nginx:nginx /etc/nginx/ssl/bibichette*
sudo chmod 400 /etc/nginx/ssl/bibichette*

Configuration Nginx

Ensuite la configuration n’est pas tellement plus compliquée qu’une configuration standard et ressemble à ça :

http {
    ...
    # optimisation pour le ssl
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    ...
    server {

        listen 443 ssl;
        server_name www.bibichette.com;
        # optimisation pour le ssl
        keepalive_timeout   70;

        ssl_certificate     /etc/nginx/ssl/bibichette-bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/bibichette.key;

        root /var/www/bibichette;
        ...
    }
}

Autres éléments à prendre en considération

Pour que votre site soit 100% compatible avec HTTPS il est nécessaire que toutes les ressources que vous utilisez dans vos pages soit également utilisées via HTTPS et pas HTTP : images, css, js, font, …

Ces éléments peuvent être distribuer directement par votre serveur en HTTPS, mais comme tous les échanges sont chiffrés, le processeur est beaucoup plus solicité et ça peut devenir un problème si comme pour ce blog vous avez des millions de visites ;)

Vous pouvez alors utiliser des CDN public pour les composants les plus utilisés, comme jQuery, les fonts, mais il faudra alors modifier le chemin d’appel http en https (si supporté par le CDN), ou plus simplement ne rien mettre et le navigateur utilisera automatiquement le schema en cours pour la page :

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

modifié en :

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

pour une font google, utilisé via @import dans une css :

@import url(http://fonts.googleapis.com/css?family=Open+Sans);

modifié en :

@import url(//fonts.googleapis.com/css?family=Open+Sans);

Pour vos fichiers spécifiques, vous pouvez faire appel à un CDN comme Amazon Cloudfront. C’est assez simple à paramétrer. Amazon va vous donner une URL du type https://d3kbu0txna7v5d.cloudfront.net/ pour laquelle vous lui indiquerez que les ressources sont disponibles à cette URL http://static.bibichette.com/.

Ainsi, dans votre site si vous indiquez une CSS disponible à cette URL : https://d3kbu0txna7v5d.cloudfront.net/css/site.css Cloudfront ira la chercher à cette endroit http://static.bibichette.com/css/site.css, la mettre en cache et renvoyer au navigateur.

Le deuxième avantage, c’est que amazon à des CDN localisés, qui seront plus près de l’utilisateur finale donc plus rapide, il va optimiser les en-têtes pour mettre en cache les contenus (suivant votre paramètrage) sur le navigateur et il vous permettra d’utiliser HTTP pour vos fichiers statiques : donc peut-être pas besoin de certificat wildcard, et le processeur de votre serveur sera soulagé.

Par contre, lors de modification de ces fichiers statiques, le navigateur utilisera peut-être les anciens à cause des caches du navigateur, et de Cloudfront. Il est alors judicieux de préfixer les URL par un numéro de version, modifié lors d’une mise à jour : https://d3kbu0txna7v5d.cloudfront.net/v1.1/css/site.css

Voila, ce n’est qu’une petite présentation pour commencer à utiliser HTTPS. N’hésitez pas à faire des remarques, je ne suis pas un pro.

0 Flares Twitter 0 Facebook 0 Google+ 0 Buffer 0 0 Flares ×

« »