Cet article vous montrera comment configurer une autorité de certification avec OpenSSL. Les certificats numériques sont des documents utilisés pour prouver la propriété d'une clé publique. Par exemple, un certificat numérique est utilisé pour authentifier un site Web consulté via HTPS. Un autre exemple d'utilisation courante est la signature de documents.
Les certificats incluent des informations sur la clé, l'identité de son propriétaire et la signature numérique d'une entité qui a vérifié le contenu. Une autorité de certification (CA) est l'organisation qui délivre les certificats numériques.
Cet article montrera également comment dire aux autres hôtes de faire confiance aux certificats émis.
Avertissement :cela devrait être uniquement à des fins de test ou de preuve de concept. Pour des utilisations réelles, vous devez acquérir de vrais certificats auprès d'une véritable autorité de certification. Par exemple, si vous voulez juste HTTPS et que vous voulez le certificat gratuitement, allez simplement sur https://letsencrypt.org/
Installer OpenSSL
Mon système d'exploitation principal est FreeBSD, et j'aime utiliser l'arborescence des ports, pour l'installer, il suffit de lancer :
# cd /usr/ports/security/openssl
# make install clean
Et attendez que la compilation et l'installation du port soient prêtes. Faites attention que vous avez probablement déjà un exécutable openssl (sous le chemin /usr/bin) et si vous l'installez quand même, le binaire "port" sera à /usr/local /bin/openssl.
La première fois que j'ai eu affaire à OpenSSL, le binaire fourni n'a pas fonctionné pour moi, mais le port fonctionne.
Fichier de configuration
Bien que mon système d'exploitation principal soit FreeBSD, à partir de maintenant, les mêmes étapes devraient être suivies sur tous les systèmes d'exploitation prenant en charge OpenSSL. Peut-être avez-vous besoin d'ajuster certains chemins, mais c'est tout.
Vous trouverez (encore une fois, dans FreeBSD) un exemple et un fichier de configuration bien commenté dans /usr/local/openssl/openssl.conf. C'est le mien après un peu de nettoyage, j'ai mis en évidence les paramètres les plus importants :
#OpenSSL Home current directory HOME = /var/openssl #choose any reasonable location #RANDFILE = $ENV::HOME/.rnd # Extra OBJECT IDENTIFIER info: oid_section = new_oids [ new_oids ] tsa_policy1 = 1.2.3.4.1 tsa_policy2 = 1.2.3.4.5.6 tsa_policy3 = 1.2.3.4.5.7 [ ca ] default_ca = YourCA # The default Certificate Authority section [ YourCA ] #most important section of your file dir = /var/openssl/yourCA # Where everything is kept # choose any reasonable location certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/CA/yourCA.crt # The CA certificate serial = $dir/serial # The current serial number #crlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRL crl = $dir/CA/yourCA.crl # The current CRL private_key = $dir/CA/yourCA.key # The private key RANDFILE = $dir/private/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = default # use public key default MD preserve = no # keep passed DN ordering policy = policy_match # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = supplied organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional localityName = supplied # For the 'anything' policy. At this point in time, you must list all # acceptable 'object' types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional ############################################################ [ req ] default_bits = 2048 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert string_mask = utf8only [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = AR #I'm on ARgentina countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Salta # i.e. the province I live on localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Your company name organizationalUnitName = Organizational Unit Name (eg, section) organizationalUnitName_default = Section Name. # eg. IT commonName = Common Name (e.g. server FQDN or YOUR name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] basicConstraints=CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = CA:true [ crl_ext ] authorityKeyIdentifier=keyid:always [ proxy_cert_ext ] basicConstraints=CA:FALSE nsComment = "OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer # This really needs to be in place for it to be a proxy certificate. proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo [ tsa ] default_tsa = tsa_config1 # the default TSA section [ tsa_config1 ] # These are used by the TSA reply generation only. dir = ./demoCA # TSA root directory serial = $dir/tsaserial # The current serial number (mandatory) crypto_device = builtin # OpenSSL engine to use for signing signer_cert = $dir/tsacert.pem # The TSA signing certificate # (optional) certs = $dir/cacert.pem # Certificate chain to include in reply # (optional) signer_key = $dir/private/tsakey.pem # The TSA private key (optional) default_policy = tsa_policy1 # Policy if request did not specify it # (optional) other_policies = tsa_policy2, tsa_policy3 # acceptable policies (optional) digests = md5, sha1 # Acceptable message digests (mandatory) accuracy = secs:1, millisecs:500, microsecs:100 # (optional) clock_precision_digits = 0 # number of digits after dot. (optional) ordering = yes # Is ordering defined for timestamps? # (optional, default: no) tsa_name = yes # Must the TSA name be included in the reply? # (optional, default: no) ess_cert_id_chain = no # Must the ESS cert id chain be included? # (optional, default: no)
Glossaire
Avant de continuer un petit tout petit glossaire des acronymes utilisés dans le dossier :
- CA :signifie autorité de certification
- CRL :signifie Listes de révocation de certificats
- CSR :signifie Certificate Signing Request
- MD :signifie Message Digest
- TSA :signifie Time Stamping Authority
Répertoire des certificats
Ensuite, créez les répertoires et les fichiers (pour l'instant vides) pour stocker nos clés et certificats :
# cd /var/openssl
# mkdir -p yourCA/CA
# mkdir -p yourCA/newcerts
# mkdir -p yourCA/certs/keys
# mkdir -p yourCA/certs/requests
# mkdir -p yourCA/certs/certificates
# cd yourCA
# touch index.txt
# echo 01 > serial
Certificat CA
Vous pouvez maintenant créer votre certificat d'autorité de certification et le signer. Mais d'abord, nous devons créer une clé privée avec la commande suivante :
# /usr/local/bin/openssl genrsa -out yourCA/CA/yourCA.key 2048
Deuxièmement, créez un CSR en exécutant :
# /usr/local/bin/openssl req -new -key ./yourCA/CA/yourCA.key -out yourCA/CA/yourCA.csr
Suivez les instructions à l'écran en faisant attention de remplir les informations correctes. Enfin, auto-signez votre certificat :
# /usr/local/bin/openssl x509 -req -days 365 \
> -in yourCA/CA/yourCA.csr -out yourCA/CA/yourCA.crt \
> -signkey yourCA/CA/yourCA.key
Et ça y est :vous pouvez maintenant commencer à signer vos certificats client et/ou Web
Certificats clients
Le processus est assez similaire au précédent. Mais nous utilisons notre certificat CA pour signer le certificat client. Et, idéalement, le client générera sa propre clé privée et le CSR.
Quoi qu'il en soit, nous ne faisons que tester des choses, donc je fais chaque étape, puis je distribue les certificats générés à mon utilisateur. Les commandes suivantes peuvent être exécutées partout, mais juste pour garder un peu d'ordre, j'utilise les dossiers créés précédemment (sous /var/openssl/yourCA/certs ). Notre utilisateur, John Doe, a d'abord besoin d'une clé privée :
# cd /var/openssl/yourCA/certs
# /usr/local/bin/openssl genrsa -des3 -out keys/johndoe.key 2048
N'oubliez pas la phrase de passe qui vous sera demandée plusieurs fois ; créez ensuite la demande de signature de certificat :
# /usr/local/bin/openssl req -new -key keys/johndoe.key -out requests/johndoe.csr
Ensuite, signez le certificat avec cette commande :
# /usr/local/bin/openssl ca -in requests/johndoe.csr -cert ../CA/yourCA.crt -keyfile ../CA/yourCA.key -out certificates/johndoe.crt
Enfin, exportez le certificat au format PKCS12, il vous sera demandé la passphrase du PK :
# /usr/local/bin/openssl pkcs12 -export -clcerts -in certificates/johndoe.crt -inkey keys/johndoe.key -out certificates/johndoe.p12
Installation du certificat
Vous pouvez maintenant émettre vos propres certificats dont votre utilisateur a besoin pour les installer afin de l'utiliser. Vous devez fournir deux fichiers :yourCA.crt et le personal johndoe.p12.
Pour l'installer sur Windows, utilisez l'outil Certificate Manager. Je ne télécharge pas plusieurs captures d'écran car, comme mes fenêtres sont en espagnol, je ne les trouverais pas très utiles. Cliquez sur le menu Démarrer et exécutez "certmgr.msc", l'écran suivant apparaîtra :
Faites un clic droit sur le dossier Autorité de certification racine et choisissez "Importer". Commencez par yourCA.crt et choisissez l'autorité de certification racine du magasin, suivez l'assistant.
Maintenant, faites un clic droit sur le dossier Personnel et répétez l'assistant avec le fichier johndoe.p12. Le mot de passe vous sera demandé. Une fois l'assistant terminé, vous pouvez voir votre certificat valide installé et les détails :
Rappelez-vous, c'est uniquement à des fins d'apprentissage. Mais c'est aussi une question de confiance. Si votre organisation est suffisamment petite et que la confiance règne, vous devriez pouvoir travailler avec ces certificats DIY.