Jacques Bodin-Hullin Développeur d'applications Web

La perfection est atteinte non quand il ne reste rien à ajouter, mais quand il ne reste rien à enlever.

Antoine de Saint Exupéry

Installation de votre SSL + Top sécurité

Maintenant que vous avez acheté votre certificat SSL Business et que vous êtes prêt à l'installer sur votre serveur, voici quelques astuces pour obtenir la qualité optimale au niveau sécurité et ainsi éviter que votre site ne s'affiche pas sur certains navigateurs (Android etc.) à cause d'une alerte de sécurité !


Les ingrédients

Pour réaliser cette recette il vous faudra :

  1. La clé de votre certificat : jacques.sh.key ;
  2. Votre certificat : jacques.sh.crt ;
  3. Le bundle de votre certificat : jacques.sh.bundle.

Le premier ingrédient est facile à trouver puisque vous l'avez généré vous-même en même temps que votre Certificate Signing Request (CSR).

Le second, le certificat, vous est délivré par une autorité de certification telle que gandi par exemple (là où vous l'avez acheté tout simplement).

La dernier est plus difficile à avoir. Voici comment faire.

Le bon bundle

Le bundle c'est votre chaîne de certification. C'est tout simplement un fichier qui contient les certificats de la chaine les uns en dessous des autres.
La chaine de certification commence par votre certificat et se termine par un certicat root. Par contre le bundle ne contient ni votre certificat ni le certificat root mais seulements ceux qui sont intermédiaires. C'est pour cette raison que ces certificats sont aussi appelés des « intermédiaires » car c'est tout simplement leur rôle.

En général il y a 3 ou 4 certificats (en comptant le vôtre et le root) dans la chaîne (exemple avec google).

Le problème c'est d'avoir les bons intermédiaires pour avoir le bon bundle !

Prenons l'exemple d'un certificat Business COMODO chiffré avec l'algorithme SHA2 :

  1. jacques.sh.crt : c'est le vôtre ;
  2. COMODOExtendedValidationSecureServerCA2.pem : c'est le dernier intermédiaire ;
  3. COMODORSAAddTrustCA.crt : c'est le second intermédiaire. Il est signé par un root certificate ;
  4. AddTrust External CA Root.cer : c'est le certificat root. Il est auto-signé et dans le « Trust Store », donc il ne lèvera pas d'exception de sécurité.

Au passage, les seuls certificats auto-signés qui sont acceptés par défaut par votre navigateur sont ceux qui sont dans le Trust Store.

Et dans le bundle on met quoi alors ? Et bien on prend les intermédiaires et on les concatène dans leur priorité croissante : le plus proche de votre certificat en premier.

-----BEGIN CERTIFICATE-----
[...]o/Br0Oksxgn
KKlHMd99SUW[...]
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
[...]bCBDQSBSb29
sHNA7qxcS1u[...]
-----END CERTIFICATE-----

De -----BEGIN CERTIFICATE----- à -----END CERTIFICATE----- c'est un certificat. Le premier est donc le contenu de COMODOExtendedValidationSecureServerCA2.pem et le second le contenu de COMODORSAAddTrustCA.crt.

On a notre jacques.sh.bundle !

Le problème c'est : comment on sait qu'on ne s'est pas trompé ?

Un certificat est signé par un autre, sauf le root qui est auto-signé. Donc si on veut le « papa » d'un certificat, que ça soit un intermédiaire ou le certifiat final, il nous faut savoir qui l'a émis.
Pour ça on ouvre le certificat et on trouve le Common name du Issuer. En gros on veut le nom du certificat parent.

Voici un exemple avec un intermédiaire COMODO (présicément celui de notre exemple, le COMODORSAAddTrustCA.crt) :

Le papa c'est donc AddTrust External CA Root. Oh bah tiens, c'est le root !

Une fois votre certificat installé sur votre serveur avec son bundle, pensez à vérifier que tout est bon ici : https://www.sslshopper.com/ssl-checker.html
Ce site vous dira si votre chaîne n'est pas bonne.

On dit souvent qu'on a pas besoin d'inclure les intermédiaires. Mais il s'avère que certains navigateurs (surtout sur mobile) ne font pas de recherche pour trouver les certificats intermédiaires pour vous. Il faut les fournir !

Note : votre certificat doit être chiffré avec l'algorithme SHA2 car le SHA1 est en fin de vie. Par conséquent le SHA2 n'étant pas géré par tous les navigateurs à l'heure où j'écris ces lignes, il est possible que vous soyez obligé d'ajouter un intermédiaire "cross-signed" dans votre bundle. Plus d'infos ici sur les intermédiaires ici : http://wiki.gandi.net/fr/ssl/intermediate

Installation sur Apache

Là c'est super simple, il vous suffit de reproduire ça dans votre VirtualHost en changeant les chemins !

Évidemment n'oubliez pas de copier les fichiers sur votre serveur !

<IfModule mod_ssl.c>
    # Activate SSL
    SSLEngine on

    # Certificates
    SSLCertificateFile /etc/ssl/certs/jacques.sh/jacques.sh.crt
    SSLCertificateKeyFile /etc/ssl/certs/jacques.sh/jacques.sh.key
    SSLCertificateChainFile /etc/ssl/certs/jacques.sh/jacques.sh.bundle
</IfModule>

Et la sécurité dans tout ça ? Là on a notre certificat mais ça ne nous donne pas une note A+ sur SSL Labs !

On va ajouter quelques petits détails sous nos certificats :

# Security
SSLCipherSuite AES128+EECDH:AES128+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff

# More security - Requires Apache >= 2.4
SSLCompression off 
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

Attention à la partie qui ne concerne que Apache >= 2.4 !

On a donc ceci dans notre VirtualHost :

<IfModule mod_ssl.c>
    # Activate SSL
    SSLEngine on

    # Certificates
    SSLCertificateFile /etc/ssl/certs/jacques.sh/jacques.sh.crt
    SSLCertificateKeyFile /etc/ssl/certs/jacques.sh/jacques.sh.key
    SSLCertificateChainFile /etc/ssl/certs/jacques.sh/jacques.sh.bundle

    # Security
    SSLCipherSuite AES128+EECDH:AES128+EDH
    SSLProtocol All -SSLv2 -SSLv3
    SSLHonorCipherOrder On
    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff

    # More security - Requires Apache >= 2.4
    SSLCompression off 
    SSLUseStapling on 
    SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
</IfModule>

Vous trouverez plus d'infos sur la partie sécurité sur Cipherli.st pour Apache/Nginx/Lighttpd/haproxy…

Avec la CipherSuite ci dessus certains navigateurs comme IE8 sur Windows XP ne pourront pas afficher votre site. C'est un choix qui n'est pas anodin. Vous pouvez utiliser le générateur de configuration SSL proposé par Mozilla pour avoir quelque chose qui vous convienne.

N'oublier pas de lancer un petit apache2ctl -t avant de recharger la configuration.

Et en dernier, testez votre site sur ssllabs !


Commentaires

blog comments powered by Disqus

Quelques infos

Contact

Mon QRcode

le QRcode