lundi 1 février 2016

Quand les certificats deviennent gratuits

Bonjour,

J'ai découvert, il y a quelque temps de cela, un article concernant Let's Encrypt. Ce projet open source est très intéressant, car il va certainement changer la donne dans le monde des certificats du Web. D'ailleurs de très gros acteurs de la toile sont partenaire du projet. Bien qu'opérationnel, à l'heure ou j'écris ces lignes, le projet est encore en phase beta. Google est bien resté en phase bêta pendant plusieurs années...
Pour ma part, je l'utilise en production.

Beaucoup d'hébergeur, vont, par l’intermédiaire de Let's Encrypt, fournir des certificats pour leurs sites hébergés. Maintenant, si vous possédez un serveur dédié ou virtuel, il va falloir le mettre en place vous même.

Je profite de ma récente mise en place de Let's Encrypt, pour vous expliquer son installation. Vous verrez, c'est d'une simplicité enfantine, surtout si vous possédez un système à jour !

Je ne vous parlerais pas de l’intérêt des certificats. Un petit cadenas vert sur certains sites, Edward Snowden, les dernières recommandations de Google pour l'indexation des sites HTTPS. Tout ces termes devraient vous mettre la puce à l'oreille, même si vous suivez l'actualité de très très loin.

Tout d'abord, Let's Encrypt sert à 2 choses. La première consiste à générer gratuitement des certificats SSL/TLS et la seconde, à les renouveler. Vous pourrez également gérer les révocations des certificats.

Pour information, Let's Encrypt est codé en Python. Actuellement, il n'existe pas de package .RPM ou .DEB. Donc, il va falloir récupérer le code directement depuis Github avec GIT.
Le package est accessible via RPM dans le dépot EPEL ou sinon vous pouvez le récupérer via GIT.

Installation via RPM : il vous suffit de taper yum install letsencrypt

Installation via GIT : Connectez-vous en root sur votre serveur. Si vous n'avez pas GIT, installez-le (ex: yum install git ou apt-get install git), puis récupérer le projet sur votre machine et déposez-le dans un espace à part (ex: /opt/letsencrypt) en faisant :

git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

Avant de poursuivre, assurez-vous d'avoir autorisé l'accès aux dépôts EPEL pour certains éléments non disponible dans les dépôts de base. Assurez vous, d'ouvrir les ports 80 et 443 sur votre serveur. Une fois le code Let's Encrypt récupéré, il vous suffit de vous rendre dans le dossier ou vous l'avez déposé (ex: cd /opt/letsencrypt), puis de tapez la commande :

./letsencrypt-auto --help all

Cette commande va s'assurer que toutes les dépendances sont en place et le cas échéant, vous les installer. Bien entendu, si vous refuser l'installation des dépendances, ne vous attendez pas à ce le programme fonctionne.
Une fois Let's Encrypt correctement installé. Il vous suffira de taper une simple commande pour générer vos certificats :

./letsencrypt-auto --apache -d toto.com

Même si pour le moment Let's Encrypt ne peut générer de certificats génériques ou wilcard certificates (*), il peut très bien générer autant de domaines connexes que vous le souhaitez.
Exemple : ./letsencrypt--auto --apache -d toto.com -d histoire.toto.com -d ftp.toto.com

Maintenant Let's Encrypt peut générer des certificats génériques (*) lire ceci.

Comme vous l'aurez remarqué, la commande comporte l'option --apache. Eh oui, Let's Encrypt possède un système de plugins qui vous permet de choisir le serveur dans lequel il va installer les éléments de configuration. Il possède également les plugins nginx, standalone, webroot et manual.
Je vous invite à consulter la documentation pour leurs manipulations respectives.
Les différents domaines et sous domaines passés en paramètres peuvent être séparés par une virgule, 
Exemple : -d toto.com,www.toto.com,ftp.toto.com,tralala.toto.com.

Pendant la génération du certificat, votre e-mail vous sera demandé. Cela servira à vous prévenir de l'expiration de vos certificats. Les certificats Let's Encrypt sont valable 90 jours.
Vous verrez également apparaître, en fonction du nombre de domaine et sous-domaine à générer un sélecteur de fichier de Let's Encrypt vous stipulant de sélectionner le fichier de configuration ou les modifications concernant le domaine à traiter devront avoir lieu.

Pour ma part, j'ai du remettre un peu d'ordre dans mes fichiers de configurations Apache après le passage de Let's Encrypt. Cependant pas d'inquiétude, même si vous n'aviez pas pris la précaution de faire une sauvegarde avant, l'outils le fait et le stocke dans un dossier de backup (ex: /var/lib/letsencrypt/backups/<serial>/ssl.conf)

Pensez à vérifier votre configuration avant de redémarrer votre serveur web.
pour apache : apache2 -t ou apachectl configtest
pour nginx : nginx -t

Une fois relancé, vérifiez vos nouveaux certificats avec https://www.ssllabs.com/ssltest/

Donc, si vous avez bien lu l'article, vous savez que vous allez devoir certifier à nouveau vos domaines tout les 90 jours au max. Le mieux serait juste avant. Pour cela une simple commande suffit :

./letsencrypt--auto certonly --apache --renew-by-default -d toto.com,histoire.toto.com,ftp.toto.com


/!\ Par instinct, je n'ai pas mélangé les domaines lors de création ou du renouvellement. Cependant Let's Encrypt gère correctement les domaines en les séparant automatiquement.

Si avez besoin de plus d'informations, la documentation officielle, c'est par ici Documentation

Et pour Windows, me diront certains ?! Je serais tenté de leur répondre ; "je n'ai pas essayé de le mettre en oeuvre et apparemment ce n'est pas gagné".

Je vous invite également à lire cette excellente critique.

mercredi 9 septembre 2015

Whois et les nouveaux TLD

Bonjour à tous et à toutes,

Comme moi, vous avez certainement bloqué devant des requêtes whois qui n'aboutissaient plus en raison de nouveaux TLD plus ou moins exotiques qui ont fait leurs apparitions.

Solution pour :
  1. GNU-Linux
  2. Windows

1. GNU-Linux

Pour ceux qui ne connaissent pas le truc le voici. Il suffit d'ajouter vos nouveaux TLD dans le fichier /etc/whois.conf.

Voici le dernier whois.conf en date.

Vous deviez trouver sur le site de l'IANA, toutes les informations nécessaire concernant les TLD à l'adresse suvante : http://www.iana.org/domains/root/db

Sinon, pour ceux qui ne veulent pas mourir sans connaitre un moyen de s'en sortir tout seul, je vous renvoi à l'excellent article de Jacob Hipps : https://ycnrg.org/whois-for-new-tlds/

2. Windows

Pour ma part j'utilise les outils Sysinternal. Cependant pour le whois de Microsoft™, je n'ai pas de solution pour le moment, hormis d'utiliser la méthode manuel décrite ci-dessus.

lundi 6 octobre 2014

La fonction méconnue de Windows 8 qui sauve la vie

Alors voilà,

Un jour, je me suis retrouvé face à Windows 8, qui refusait de démarrer juste après la page d'authentification de l'utilisateur. Et là, pour ceux qui ne le savent pas encore, vous allez voir comme c'est simple de réparer son Windows en moins de temps qu'il ne faut pour le dire. Cet astuce m'a été donnée par le support Dell (encore merci à eux).
Ne m'étant pas encore aventuré dans les méandres de Windows 8, je suis bien content d'avoir eu affaire à ce support.

J'avais cherché en vain dans ma mémoire les moyens d'interrompre le démarrage de Windows. Mais avec la version 8 et certainement les versions qui suivront, ceci n'est pas vraiment possible. Le démarrage est trop rapide pour appuyer sur la touche F8. Donc j'ai cherché dans un tas de forums plus ou moins bien informé. D'après les messages consultés il suffisait d'ouvrir la barre des charmes (vous savez, la barre qui apparaît à droite et qui permet certaines fonctions systèmes), de rentrer dans la configuration Windows pour lui dire qu'au redémarrage il passera en mode sans-échec.
Oui mais bon pour faire cela, encore eu-t-il fallu que je puisse y accéder a cette foutue barre des charmes. Parce que même avec le raccourci Win+I, walou, nada, que tchi.

Allez, je ne vous fait pas plus languir. Si vous réussissez à vous trouvez sur la page d'accueil de Windows 8, il vous suffit d'appuyer sur la touche Shift (↑) et cliquer sur le menu arrêter (choix redémarrer).
Et oh miracle, une page concocter par les p'tits gars de Redmond vous permettra d'effectuer certaines opérations de maintenance.

Pour ma part j'ai du «Actualiser le PC». Ce qui à pour effet de réinstaller Windows sans toucher au fichiers des utilisateurs (ouf). Après le redémarrage vous retrouverez l'ancien Windows dans un dossier \Windows.old qui pourra sans problème faire partie de la prochaine benne. Cerise sur le gâteau, les applications présentes sur le système le jour de l'acquisition du PC seront elles aussi réinstallé (ex: anti-virus, ...)

A tout ceux qui ont résisté à s'ouvrir leurs veines, je vous salue et vous souhaite bonne continuation.

;-)

lundi 24 février 2014

On ne naît pas pour être quelque chose, mais c'est parce qu'il y a eu quelque chose que l'on naît.
Qu'est ce qui est plus idiot que de poser une question ?...
...ne pas la poser.
La vérité n'est vrai que jusqu'à ce que l'on prouve le contraire.

jeudi 28 mars 2013

Horizontalisation SQL

Bonjour,

Je présente ici une fonction permettant l'horizontalisation d'une requête SQL ou le déformatage de celle-ci, si vous préférez. Elle peut être également utiliser pour autre chose que du script SQL.

Quand je code, j'utilise les techniques en adéquation lié au projet. Soit je prend un ORM ou bien j'utilise du code texte avec des fonctions d'échappements (en l’occurrence SQL) pour les autres occasions. Si vous utilisez un ORM, nul besoin d'utiliser cette fonction.

Par contre si vous avez l'habitude de saisir vos requêtes verticalement dans votre code source pour une bonne lecture de celle-ci et que vous considérez (névrotiquement ou non) que transmettre tel quel la requête au serveur est un sacrilège en soit, vous pouvez donc prévoir l'emploi de cette fonction.

Ceci dit, j'aurais peut être réussi à la faire en tant qu'expression régulière, mais je n'ai pas pris la peine de m'y attardé pour la raison suivante.
Même si je considère les expressions régulières par principe génialissime, elles sont dangereuses pour la compréhension du code (non commenté), mais également pour une maintenance à long terme.
Il existe beaucoup de champions d'expressions régulières, mais souvent la lecture d'une expression peut prendre du temps et être mal interprété. D'ou l'existence, quasi obligatoire, de tests unitaires. Ne serait ce que pour les comprendre après une période d'abstinence dans la lecture de codes sources.

Pour utiliser cette fonction il suffit de transmettre la chaîne de votre requête SQL (échappé, je l'espère) en paramètre et celle-ci vous la retournera sans les éléments définis par défaut dans la fonction (les retours à la ligne, saut de lignes, tabulations et double espace). Les éléments n'étant retirés que de la partie d'instruction et non des valeurs transmises. J'ai rajouté le paramètre $elements pour surcharger la fonction si nécessaire.

Comme actuellement je travail beaucoup en PHP, vous trouverez le code sous cette forme.
La transformation vers un autre langage est à mon avis très aisé. Dans cet exemple, je n'ai pas pris en compte le traitement de chaînes multi-octets (ex: utf8). Je vous laisserais le plaisir de le faire.
 /**  
  * @author zenerzhul  
  * @name  horizontalisation  
  * @version 0.4  
  * @param  string $chaine  
  * @param  array $element (optional) 
  * @return string  
  */  
 function horizontalisation( $chaine, $elements = NULL )  
 {  
   if ( is_null( $elements ) )  
   {  
    $elements = array( chr( 9 ), chr( 10 ), chr( 13 ), str_repeat( chr( 32 ), 2 ) );  
   }  
   foreach ( $elements as $recherche )  
   {  
    $decalage = 0;  
    $largeur = strlen( $recherche );  
    $i = strpos( $chaine, $recherche, $decalage );  
    while ( $i !== FALSE )  
    {  
      if ( !( strpos( $chaine, "'" ) < $i ) ^ !( strpos( $chaine, "'", $i + 1 ) > $i ) )  
      {  
       $chaine = substr( $chaine, 0, $i ) . ' ' . substr( $chaine, $i + $largeur );  
       $decalage = $i;  
      }  
      else  
      {  
       $decalage = $i + $largeur;  
      }  
      $i = strpos( $chaine, $recherche, $decalage );  
    }  
   }  
   return $chaine;  
 }

Voici un example d'utilisation (MySQL) :
 $string = "SELECT  
        boson,  
        lepton,  
        fermion  
       FROM   
        spectral   
       WHERE   
         fi = 1  
        AND  
         alpha <> 'B''  
       E T      
       A'  
       LIMIT 0 ,   10;";  
 echo '<pre>' . horizontalisation( $string ) . '</pre>';  

Résultat :
 SELECT boson, lepton, fermion FROM spectral WHERE fi = 1 AND alpha <> 'B''
            E T       
            A' LIMIT 0 , 10;  

Si vous comprenez le résultat ci-dessus, très bien et c'est normal. Maintenant pour ceux qui s’attendaient à autre chose, laissez-moi vous expliquer.

Premièrement la chaîne $string est une chaîne de caractères avec des retours à la ligne, des tabulations et ou des espaces multiples, bien !

Dans l'exemple je demande à afficher le résultat à travers une balise <pre>, ce qui a pour objectif de traiter le texte dans son intégralité et non d'absorber les caractères spécifiques (retour à la ligne, saut de page, tabulation, espace multiple) en un seul et même caractère, j'ai nommé, l'espace. Donc nous nous retrouverons comme si nous allions avoir un résultat brute.

Toujours dans l'exemple, l'appel à la fonction horizontalisation ne transmet que la chaîne $string, car nous n'avons pas besoin de surcharger la variable $elements dans notre cas. De toute façon, cette variable $elements est contrôlé puis définie si rien n'a été transmit lors de l'appel à la fonction.

À l'intérieur de cette fonction nous allons traiter les $elements 1 par 1.  Je ne suis pas certains que ce soit le meilleur algorithme, mais bon pour faire trois cycle, vous voyez...

Dans la boucle secondaire while ( ... traite la chaîne $chaine tant que le caractère recherché est trouvé. De plus, au coeur de cette boucle nous vérifions bien que le caractère recherché à remplacer par un seul espace n'est pas compris entre des guillements (single quote) avec le test conditionnel suivant :
 if ( !( strpos( $chaine, "'" ) < $i ) ^ !( strpos( $chaine, "'", $i + 1 ) > $i ) )  

Le test nous dit que le caractère ne peux se trouver que soit avant un guillemet soit après mais pas au centre. Pour info le caractère ^ est un xor (ou exclusif).

Donc voila, c'est tout.

PS : J'ai cherché cette fonction sur le web sur différent site de programmation, je ne l'ai pas trouvé. Elle ne fait pas grand chose mais elle le fait. Et surtout elle ne fait que ce pourquoi elle est censé exister.