Sécuriser une application Golang

Sécuriser la confidentialité des données de sa plateforme web ou de son service SaaS est essentiel. Cette pratique passe par l'utilisation de certificats TLS.

Si vous développez une application Golang vous êtes en mesure de facilement mettre en place cette sécurité. On vous explique comment réaliser ceci étape par étape.

Qu'est-ce que TLS/SSL ?

TLS (anciennement appelé SSL) est un protocole d'échange de clés de chiffrement. Cette sécurité permet de garantir la confidentialité des données qui vont passer par un canal de communication.

En clair, l'intérêt de ceci réside dans le fait que si un cyber-criminel intercepte l'échange de messages entre vous et un serveur web, il ne pourra pas lire le contenu de vos messages.

Comment ceci fonctionne en production ?

Pour sécuriser votre communication vous devez mettre en place un certificat TLS sur votre serveur. Le fonctionnement est simple mais généralement complexe à appréhender. On va essayer de vous expliquer.

Le propriétaire d'une plateforme web doit commencer par générer une clé privée, puis une clé publique associée à la première. Ce couple de clé est aussi associé à un nom de domaine précis. Celui de la plateforme à sécuriser.

Le propriétaire va communiquer la clé publique à une Autorité de Certification. Celle-ci va s'assurer que vous possédez bien la propriété du nom de domaine en question. Cette procédure nécessite souvent des démarches administratives mais peut aussi être totalement automatisée (avec letsencrypt notamment). Dès lors, lorsqu'un internaute souhaite communiquer avec vos serveurs de manière sécurisée, il va demander ce certificat et lui faire confiance (ou pas). La communication sera alors confidentielle.

Avec Golang

On va commencer par créer une clé privée au moyen de la commande suivante:

$ openssl genrsa -out server.key 2048

Puis nous allons générer un certificat:

$ openssl req -new -x509 -sha256 -key server.key -out server.pem -days 3650 Note importante: il est important de renseigner localhost à la question Common name.

Dans le code source de votre programme Golang vous allez pouvoir remplacer le traditionnel appel de la méthode http.ListenAndServe par http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)

A ce stade, si vous essayez de naviguer sur votre projet web, vous obtiendrez une erreur de sécurité. En effet, l'Autorité de certification est inconnue par votre système.

Si vous utilisez curl, vous pouvez outre passer cette erreur en utilisant le paramètre -k.

Exemple $ curl -i -k https://localhost:443

Eviter l'erreur

Pour éviter l'erreur, nous allons créer une autorité de certification. Puis nous allons la faire reconnaitre par notre navigateur.

On va générer une nouvelle clé privée pour l'autorité de certification:

$ openssl genrsa -out rootCA.key 2048

Puis un nouveau certificat destiné à l'autorité de certification (bien renseigner 'Mon autorité de développement' lors de la question 'Common Name').

$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

Nous allons faire reconnaitre l'AC à votre environnement de développement. Sur Mac, pour Chrome et Safari: -> Open Keychain Access on your Mac and go to the Certificates category in your System keychain. Once there, import the rootCA.pem using File > Import Items. Un message rouge indique que le certificat n'est pas fiable. Alors: Double cliquez sur “When using this certificate:” dropdown to 'Always Trust in the Trust section'. -> Pour firefox il faut ajouter le fichier .pem aussi dans les Préférences

Nous allons finir en réalisant une requête de certification (qui devrait normalement être envoyée à l'AC).

$ openssl req -new -sha256 -nodes -out server.csr -key server.key

Puis on va signer le certificat (ce qui permet de générer un certificat x509)

$ openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256

Dès lors le fichier server.csr (la requête ne sert plus à rien), il peut être supprimé. Qu'en à lui, le fichier server.crt est le certificat, il doit etre utilisé par le serveur et non plus server.pem.

Nous proposons un service de cyber-sécurité.

Contactez-nous