GNU/Linux >> Tutoriels Linux >  >> Linux

Autorité de certification avec OpenSSL

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.


Linux
  1. Test des connexions SSL avec SSLyze, Nmap ou OpenSSL

  2. Impossible de signer Csr avec la clé racine Ca ?

  3. Générer des empreintes digitales Hpkp pour toute la chaîne de certificats ?

  4. Générer une demande de signature de certificat

  5. Comment compiler le fichier .c avec OpenSSL inclut ?

Créez votre propre autorité de certification (CA) dans CentOS/RHEL

Comment générer des certificats SSL auto-signés à l'aide d'OpenSSL

Remplacer un certificat SHA-1 par un certificat SHA-2 dans Plesk

Sécurisez Nginx avec le certificat SSL Let's Encrypt sur Ubuntu 18.04

Comment sécuriser Nginx avec le certificat SSL Let's Encrypt

Comment générer un certificat openssl avec une expiration inférieure à un jour ?