Utiliser un certificat pour signer son code

[30/12/2014]L’utilisation des certificats est une chose un peu confidentielle, cela parait compliquĂ©, cher et nĂ©buleux. Pourtant c’est trĂšs simple Ă  condition de bien comprendre comment se servir du fichier fourni par l’autoritĂ© de certification


Pourquoi des certificats ?

Les certificats sont les descendants modernes des sceaux que les autoritĂ©s gardaient jalousement et dont elles se servaient pour authentifier des documents. Ces sceaux pouvaient ĂȘtre des timbres pour crĂ©er une empreinte dans de la cire chaude ou des tampons encreurs ou gaufreurs  comme l’administration en utilise encore aujourd’hui. Ces sceaux permettaient de valider l’identitĂ© du signataire d’un document. De l’édit royal au passeport en passant par le dĂ©cret ministĂ©riel ou le permis de conduire, l’extrait K-Bis du registre du commerce, l’extrait de casier judiciaire du ministĂšre de la justice, 
 l’Etat a utilisĂ© et utilise encore des sceaux pour certifier des documents et en prouver l’authenticitĂ©.

Il n’est pas possible de “gaufrĂ©â€ un mail, pas plus qu’il n’est possible de mettre une empreinte de cire sur un logiciel ou d’encrer un setup


De lĂ  est nĂ© l’idĂ©e de fabriquer des sceaux Ă©lectroniques basĂ©s sur la cryptographie pour garantir l’identitĂ© de la source d’un logiciel ou celle d’un serveur Web.

Puisque ces sceaux Ă©lectroniques permettent de garantir l’identitĂ© d’une personne (morale le plus souvent) il en dĂ©coule plusieurs utilisations qui bien Ă©videmment n’existaient pas pour la version physique. Par exemple un certificat Ă©lectronique peut ĂȘtre utilisĂ© pour garantir et sĂ©curiser une connexion entre un poste client et un serveur sur Internet. C’est le fameux petit verrou ou cadenas affichĂ© par la plupart des browsers lorsque la connexion est ainsi validĂ©e.

SSL est une utilisation parmi d’autres et il est aussi possible de certifier une identitĂ© dans d’autres contextes. C’est le cas des logiciels.

Code ou installeur ?

Une application c’est d’abord du code puis cela devient un exĂ©cutable. Ce dernier est gĂ©nĂ©ralement dĂ©ployĂ© au travers d’un installeur (setup).

Ces deux facettes donnent lieu à deux types de certification : la signature du code et la signature de l’installation.

Signer un installeur (setup) dans le monde Microsoft se fait en utilisant un certificat lorsqu’on créé un dĂ©ploiement Click-Once.

Le fichier fourni par l’autoritĂ© de certification est utilisable directement pour peu qu’on ait acquit un certificat de signature de code, ce qui diffĂšre des certificats pour SSL par exemple.

L’intĂ©rĂȘt est Ă©vident, un installeur signĂ© pourra ĂȘtre dĂ©ployĂ© chez des tiers qui, s’ils font confiance Ă  l’émetteur, auront la certitude grĂące Ă  la signature que le setup provient bien de ce dernier. Si vous faites confiance Ă  Microsoft et si un fichier d’installation est signĂ© par un certificat vous assurant que ce setup provient bien de chez Microsoft et qu’il n’a pas Ă©tĂ© modifiĂ© par un tiers alors vous pouvez installer le logiciel en toute confiance. Si l’installeur n’est pas signĂ© ou bien si la signature n’est plus valable, vous aurez raison de vous mĂ©fier.

Les certificats pouvant ĂȘtre installĂ©s dans un “magasin” sous Windows, il est ainsi possible de se crĂ©er une bibliothĂšque de certificats auxquels ont fait confiance systĂ©matiquement. DĂšs lors les logiciels provenant des sources utilisant ces certificats s’installeront facilement et sans question ni validation spĂ©ciale.

Il y a donc un grand intĂ©rĂȘt pour une entreprise Ă  signer ces installeurs car cela permet aux clients d’ĂȘtre certains de la source. Il y a aussi une question d’image de marque : si un hacker peut glisser un virus ou autre ver dans un module d’installation qui ressemble Ă  l’un de vos logiciels c’est votre image de marque qui sera tĂąchĂ©e parfois pour toujours. Un installeur signĂ© ne peut pas ĂȘtre bricolĂ© et votre image de marque sera prĂ©servĂ©e.

Pour le code les raisons et l’utilisation mĂȘme de la signature sont trĂšs diffĂ©rentes.

Signer du code

Signer du code est une autre utilisation des certificats. Ici les raisons sont diffĂ©rentes, plus techniques. Notamment la signature d’un code .NET permet de crĂ©er des “noms forts” (strong names) pour les espaces de noms.

Visual Studio permet de signer un code en fabricant un fichier “pfx” automatiquement. Ce dernier est protĂ©gĂ© par un mot de passe. Alors pourquoi passer par un certificat ?

La diffĂ©rence se joue dans la “qualitĂ© de l’authentification”. N’importe qui peut avec Visual Studio signer un code avec un “pfx”. De l’éditeur de logiciels trĂšs sĂ©rieux au bricoleur, de l’entreprise la plus sĂ©rieuse au premier margoulin venu..

En utilisant un certificat Ă©mis par une autoritĂ© de certification pour signer un code .NET on offre quelque chose de plus : l’assurance que l’identitĂ© de l’émetteur est validĂ©e. Et cela fait toute la diffĂ©rence.

Dans certains contexte les noms forts sont obligatoires, sur certaines machines seuls du code signĂ© peut ĂȘtre autorisĂ© Ă  effectuer certaines opĂ©rations. Si la clĂ© de signature n’a pas de certification le code mĂȘme signĂ© ne sera pas autorisĂ© Ă  s’exĂ©cuter. Seul du code signĂ© par un certificat Ă©mis par une autoritĂ© valide le pourra.

Typiquement il faut savoir qu’on signe avec un nom fort ce qui doit ĂȘtre partagĂ©, donc des DLL et non un EXE. Et cela n’a d’intĂ©rĂȘt principalement que si les DLL en question doivent ĂȘtre dĂ©ployĂ©es dans le GAC ou bien s’il s’agit de ressources partagĂ©es entre plusieurs logiciels.

La signature d’un code .NET, la crĂ©ation de noms forts n’est pas le sujet de cet article je n’irais pas plus loin sur ce sujet ici. Ce qui compte c’est de comprendre la diffĂ©rence qui peut exister entre un nom fort créé avec une clĂ© “pfx” gĂ©nĂ©rĂ©e sous VS et un nom fort signĂ© par un certificat Ă©mis par une autoritĂ© de certification.

Est-ce cher ?

Prenons l’autoritĂ© Digicert, pour un certificat de signature de code le prix est de $223/an pour une annĂ©e et de $178.33/an si on achĂšte un certificat valable 3 ans.

Est-ce cher ? Oui et non. Si vous ĂȘtes juste un dĂ©veloppeur amateur ou un prestataire faisant de la sous-traitance cela ne vous servira pas Ă  grand chose et donc oui c’est cher jusque pour s’amuser chez soi


Si vous Ă©ditez des logiciels, si vous crĂ©ez des logiciels au sein d’une grande entreprise, d’un groupe, certifier les applications et les installations pour moins de 200 euros par an devient rĂ©ellement un investissement ridicule au regard du service rendu. Donc non, ce n’est pas cher.

Donc acheter un certificat n’est pas cher et devrait ĂȘtre systĂ©matique pour protĂ©ger les applications qu’on distribue.

Est-ce compliqué ?

Chaque autoritĂ© de certification possĂšde ses propres mĂ©thodes d’enquĂȘte pour valider l’identitĂ© d’un demandeur de certificat. Dans certains cas l’opĂ©ration peut ĂȘtre longue, tout dĂ©pend des preuves que le demandeur peut amener.

J’ai testĂ© le processus avec Digicert qui offre aux MVP la possibilitĂ© d’obtenir gratuitement un certificat. Ils sont intelligents car sans ce geste j’avoue que je n’aurais pas investi 200€ juste pour Ă©crire un article ici, mĂȘme si j’aime mes lecteurs Sourire.

Disposant d’une sociĂ©tĂ© (e-naxos) et ayant une prĂ©sence officielle attestĂ©e Ă©vidente, le processus de certification a Ă©tĂ© trĂšs rapide, en moins de 48h aprĂšs quelques Ă©changes de mails et d’informations le certificat Ă©tait disponible et utilisable. Il faut dire que le profil MVP gĂ©rĂ© par Microsoft additionnĂ© au site e-naxos et ses informations liĂ©es au nom de domaine via le registrar et tout le reste me permettent de facilement prouver mon identitĂ©. Mais comme on suppose qu’un certificat n’a d’intĂ©rĂȘt que pour une entreprise ou un Ă©diteur de logiciels, on peut affirmer que tous ces utilisateurs potentiels de certificat n’ont aucune difficultĂ© Ă  prouver leur identitĂ©.

Donc ce n’est pas compliquĂ© d’obtenir un certificat, c’est mĂȘme plus rapide que je ne le pensais. En tout cas chez Digicert que j’ai pu tester.

Est-ce vraiment utile ?

Est-ce cher ? non. Est-ce compliquĂ© ? non. Est-ce vraiment utile ? Poser la question ici ne sert qu’à complĂ©ter logique la progression induite par les deux premiĂšres mais en rĂ©alitĂ© toute l’introduction de cet article y rĂ©pond et la rĂ©ponse est Ă©vidente, oui c’est vraiment utile.

Il est utile de pouvoir crĂ©er des noms forts .NET signĂ©s par une clĂ© issue d’un vrai certificat, il est tout aussi utile de signer un installeur ClickOnce pour prouver qu’un logiciel est sain, d’origine, non bricolĂ©, et que son crĂ©ateur est bien identifiĂ©.

Est-ce pérenne ?

Autre question intĂ©ressante. Puisque les certificats s’achĂštent Ă  l’annĂ©e, comment la pĂ©rennitĂ© fonctionne-t-telle dans ce contexte ? Est-il nĂ©cessaire de re-signer tous les setups chaque annĂ©e ?

Il y a deux points de vue Ă  considĂ©rer : le premier concerne l’image de marque de l’émetteur. Si l’utilisateur installe un logiciel dont le certificat n’est plus valable ce n’est pas un bon signal, l’émetteur existe-t-il toujours, a-t-il encore une activitĂ© ? Installer un logiciel d’une sociĂ©tĂ© qui n’a pas les moyens de renouveler son certificat n’est pas une bonne UX. Donc de ce point de vue lĂ  il faut renouveler le certificat pour que d’annĂ©e en annĂ©e il reste valide. Mais attention, renouveler le certificat ne signifie pas signer Ă  nouveau les setups, c’est juste un acte auprĂšs de l’autoritĂ© de certification.

Mais il existe un autre point de vue : signer un setup n’a rien Ă  voir avec certifier une identitĂ© SSL pour un site Web. Un site Web dont le certificat n’est plus valide c’est problĂ©matique car c’est toute la sĂ©curisation de la connexion qui peut ĂȘtre mise en doute. Avec un setup les choses sont diffĂ©rentes, ce qui compte c’est de pouvoir prouver que ce setup lĂ  a bien Ă©tĂ© Ă©mis par la sociĂ©tĂ© X. Il s’agit d’une vĂ©ritĂ© intemporelle : si le setup a bien Ă©mis par X, alors mĂȘme dans 10 ans, et mĂȘme si le certificat n’a pas Ă©tĂ© renouvelĂ©, la signature dira que c’est bien X qui a Ă©mis le setup Ă  l’époque et qu’il s’agit donc bien d’un setup lĂ©gitime et intact.

Donc du point de vue technique un certificat de signature de code est toujours valide car ce qu’il prouve est intemporel, il constate un acte historique qui ne peut changer avec le temps. Du point de vue de l’image de marque un certificat non renouvelĂ© ne donne pas une excellente impression et il faut en tenir compte selon comment le logiciel doit ĂȘtre exploitĂ© (vendu Ă  des clients ou utiliser en interne d’un groupe ou d’une entreprise).

Un peu de lecture

Il existe un bon article sur MSDN qui prĂ©cise comment et pourquoi signer un code ou un installeur avec un certificat, le lecteur intĂ©ressĂ© par le sujet y trouvera donc une information fort utile : 

ClickOnce Manifest Signing and Strong-Name Assembly Signing Using Visual Studio Project Designer's Signing Page

Un autre article du blog de Michael Johnson explique de façon rapide comment signer un logiciel WPF avec un certificat : Signing WPF software with an Authenticode Certificate

Astuces pratiques

il pourrait s’agir ici de rĂ©pondre Ă  la question “est-ce facile ?”


La rĂ©ponse est oui et non Ă  la fois. Oui une fois qu’on sait comment se servir du fichier fourni, non quand on patauge avec VS qui refuse le fichier original !

Ayant testĂ© le processus je peux vous livrer quelques informations qui vous feront peut-ĂȘtre gagner du temps


Une fois le certificat obtenu Digicert vous envoie une confirmation et une page de téléchargement. On peut y récupérer le fameux certificat.

On cherche partout sur son disque, mais aucun fichier n’a Ă©tĂ© tĂ©lĂ©chargé  Qu’est-ce-qui c’est passĂ© ? Le certificat est perdu ? 
 Tant de questions angoissantes !

En rĂ©alitĂ© le certificat tĂ©lĂ©chargĂ© est installĂ© par le browser dans le magasin de certificats. On n’a donc rien rĂ©cupĂ©rĂ©, c’est juste du vent, pas de fichier
 rien de “palpable” si tant est qu’un fichier informatique soit palpable !

En bricolant on arrive Ă  extraire un fichier mais ce dernier n’est pas reconnu par Visual Studio pour signer un code. La clĂ© du certificat peut ĂȘtre exportĂ©e, dĂ©truite ou rĂ©importĂ©e grĂące Ă  “certmngr.msc”, c’est dĂ©jĂ  ça, mais pourquoi VS refuse-t-il de s’en servir pour signer le code ?

Le message d’erreur est “Impossible de trouver le certificat et la clĂ© privĂ©e pour le dĂ©chiffrement”.

Avec ça on est bien avancĂ©. j’adore ce genre de message d’erreur. C’est du français, on comprend chaque mot, mais la phrase
 ne dit rien du tout car elle ne correspond pas rĂ©ellement Ă  ce qu’on vit ! Ici on a bien le certificat et on vient juste de le sĂ©lectionner dans le disque dur donc on sait que VS peut le trouver. Donc il faut tel le saumon qui remonte la riviĂšre pĂ©niblement tenter de remonter Ă  la source de l’erreur pour en comprendre la nature.

Je vous ferai grĂące de mes recherches sur le Web souvent infructueuses (peu de gens visiblement signent avec des certificats et encore moins en parle !).

La version courte consiste Ă  exporter la clĂ© en pfx mais SANS la chaĂźne de certificats. Juste une case Ă  cocher convenablement donc. Une fois une telle clĂ© exportĂ©e VS peut s’en servir pour signer un code (nom fort).

Si on exporte avec la chaĂźne de certificats le fichier obtenu peut ĂȘtre utilisĂ© avec ClickOnce mais pas pour signer du code.

DerniĂšre astuce, Digicert met Ă  disposition une application de gestion des certificats “DigiCertUtil.exe” qu’il faut rĂ©cupĂ©rer sur leur site. C’est plus agrĂ©able Ă  utiliser que l’usine Ă  gaz de Windows, et on peut ici aussi exporter les clĂ©s ce qui rend l’opĂ©ration plus ‘user friendly’.

Conclusion

Un certificat de signature de code c’est utile, ce n’est pas cher, pas compliquĂ© Ă  obtenir et une fois quelques astuces connues c’est trĂšs facile Ă  utiliser.

Si on est dans une position oĂč on distribue du code, qu’il s’agisse de composants sous forme de DLL, de fichiers Ă  installer dans le GAC ou bien s’il s’agit de certifier un setup, il n’y a aucune raison de ne pas utiliser un certificat. Cela concerne donc principalement les Ă©diteurs de logiciel mais aussi les entreprises ou les groupes au sein desquels on est amenĂ© Ă  dĂ©ployer DLL ou applications.

Si c’est juste pour faire joujou tout seul dans son coin, cela n’a aucun intĂ©rĂȘt. Mais ce n’est pas conçu pour ça, ça tombe bien !