[howto] Creation d'un certificat pour signature de code
Le but de ce howto et de:
Générer un certificat, permettant de signer du code ou des applications.
Etant donné mon ancien travail, cette procédure n'a été utilisée que dans un environnement d'OS propriétaire.
Disclamer: Cette procédure est faite en avril 2018. Il est nécessaire de vérifier les bonnes pratiques avant toute chose ! Les normes concernant SSL changent constamment, à cause de nouveaux périphériques, ou encore de failles comblées.
Création du certificat
La procédure est la même que pour créer un certificat pour un service. Seul le fichier de configuration sera différent, pour ajouter l'option, qui autorise la signature de code.
Le fichier de configuration à utiliser:
[ req ]
distinguished_name = req_distinguished_name
req_extensions = v3_req
x509_extensions = v3_ca
[ v3_req ]
#subjectAltName = @alt_names
#subjectAltName_default = nailyk.fr
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
#subjectAltName = @alt_names
extendedKeyUsage = codeSigning
[ req_distinguished_name ]
country_name = Country Name (2 letter code)
countryName_default = FR
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = France
localityName = Locality Name (eg, city)
localityName_default = None
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = nailyk
commonName = Common Name (eg, YOUR name, FQDN server)
commonName_default = nailyk.fr
commonName_max = 64
[ usr_cert ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature
extendedKeyUsage = codeSigning
[ v3_ca ]
#nameConstraints = permitted;DNS:*
#subjectAltName = copy
[alt_names]
#DNS.1 = nailyk.fr
Créer la demande de certificat:
openssl req /tmp/ssl
-new
-newkey rsa:4096
-keyout ps.key
-sha256
-out ps.csr
-config ./codesigning.conf
Generating a 4096 bit RSA private key
...............................................................++
...........................................................................++
writing new private key to 'ps.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
State or Province Name (full name) [France]:
Locality Name (eg, city) [None]:
Organizational Unit Name (eg, section) [nailyk]:
Common Name (eg, YOUR name, FQDN server) [nailyk.fr]:
openssl req
-in ps.csr
-text -noout
Certificate Request:
Data:
Version: 0 (0x0)
Subject: ST=France, L=None, OU=nailyk, CN=nailyk.fr
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
[...]
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Extended Key Usage:
Code Signing
Signature Algorithm: sha256WithRSAEncryption
[...]
La validation par la CA se fait de la même façon que précédemment. Ne pas oublier d'utiliser le fichier de config codesigning.conf.
openssl x509
-days 700
-req -sha256
-in ps.csr
-out ps.crt
-CA ca.crt
-CAkey ca.key
-CAserial ca.srl
-extensions v3_req
-extfile codesigning.conf
Signature ok
subject=/ST=France/L=None/OU=nailyk/CN=nailyk.fr
Getting CA Private Key
Enter pass phrase for ca.key:
openssl x509 /tmp/ssl
-in ps.crt
-noout
-text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
a1:5f:66:b3:0e:61:d1:93
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=FR, ST=France, O=nailyk, CN=nailyk/emailAddress=ca@nailyk.fr
Validity
Not Before: May 3 09:16:34 2018 GMT
Not After : Apr 2 09:16:34 2020 GMT
Subject: ST=France, L=None, OU=nailyk, CN=nailyk.fr
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
[...]
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
X509v3 Extended Key Usage:
Code Signing
Signature Algorithm: sha256WithRSAEncryption
[...]
Le certificat de signature est maintenant généré. Il sera nécessaire de le déployer (ainsi que la CA) sur toutes les machines qui devront exécuter les script ou applications signées avec.
Creation d'un conteneur pfx
La plupart du temps, avoir un conteneur pfx est nécessaire pour signer des applications. Ce conteneur peut intégrer différentes parties de la chaîne de signature. Ici nous avons besoin uniquement du certificat fraîchement créé ainsi que de la clef privée.
Attention: Il est nécessaire de rentrer une clef pour la protection du conteneur.
openssl pkcs12
-export -out ps.pfx
-inkey ps.key
-in ps.crt
Enter pass phrase for ps.key:
Enter Export Password:
Verifying - Enter Export Password:
Intégration du certificat et de la clef dans une machine de développement win7
Double cliquer sur le conteneur précédemment créé:
L'outil d'import de certificats s'ouvre (il n'est pas nécéssaire d'être administrateur de la machine, car le certificat sera importé dans le compte utilisateur)
Entrer la clef de protection du conteneur
Etape très importante: l'import doit se faire dans le magasin editeurs approuvés. Si non vous ne serez pas en mesure de signer le code.
Valider le résumé
Il est possible, en fonction de l'environnement, que une fenettre suplémentaire apparaisse concernant la sécurité des clefs:
Le certificat apparait bien dans le magasin de l'utilisateur:
La clef sur l'icone montre qu'une clef privée est également disponible. Celle-ci est indispensable pour réaliser la signature du code.
Signature d'un script
Attention: Avant de signer un script, il est nécessaire de le convertir en UTF-8! (No comment...)
Depuis une console powershell (ne fonctionne pas depuis l'ISE! ):
Set-AuthenticodeSignature .psscript.ps1 @(Get-ChildItem cert:CurrentUserTrustedPublisher -codesign)[0] -TimeStampServer http://timestamp.verisign.com/scripts/timstamp.dll
La partie @(Get-ChildItem cert:CurrentUserTrustedPublisher -codesign)[0] permet d'aller chercher la première clef disponible de le magasin éditeurs approuvés. Le nombre 0 est donc à ajuster en fonction des besoins.
Note: Pour afficher la liste des certificats utilisateurs dans le magasin éditeurs approuvés (toujours depuis une console powershell):
cd cert:CurrentUserTrustedPublisher
Get-ChildItem -CodeSigningCert
References
http://thecuriousgeek.org/2014/02/creating-openssl-code-signing-certs-on-windows/