Comment configurer votre propre autorité de certification avec OpenSSL
Comment configurer votre propre autorité de certification avec OpenSSL
Principe de la cryptographie à clé publique
Connue aussi sous le nom de cryptographie asymétrique résout le problème de deux entités communiquant
en toute sécurité sans jamais échanger une clé commune, en utilisant deux clés liées, une privée, une publique.
Le texte chiffré avec la clé publique ne peut être déchiffré que par la clé privée, et les signatures vérifiables avec la clé publique ne peuvent être créées avec la clé privée.
Mais si les deux entités ne se connaissent pas encore elles ont un moyen de savoir avec certitude qu’une clé publique correspond à la clé privée de l’autre identité.
En d’autres termes, quand Alice parle à Bob, Bob dit à Alice “c’est ma clef publique K, utilise-la pour communiquer avec moi” Alice a besoin de savoir que c’est vraiment à Bob clé publique et non celle d’Eve.
La solution habituelle à ce problème consiste à utiliser une PKI.
Public Key Infrastructure - PKI
Une PKI est un arrangement qui lie des clés publiques à des identités au moyen d’une Autorité de certification (AC).
Une AC est un tiers de confiance centralisé dont la clé publique est déjà connue.
De cette façon, quand Alice parle à Bob, Bob montre à Alice un message signé par Trent, à qui Alice connaît et fait confiance, qui dit “cette clé publique K appartient à Bob”.
Ce message signé s’appelle un certificat et peut contenir d’autres informations.
Alice est capable de vérifier la signature à l’aide de la clé publique de Trent et peut savoir parler avec confiance à Bob.
Il est également courant d’avoir une chaîne de confiance. Alice parle à Bob, Trent le fait ne connaît pas Bob mais connaît Carol qui connaît Bob, alors Bob montre à Alice une chaîne de certificats, un de Carol indiquant quelle clé appartient à Bob et un de Trent qui dit quelle clé appartient à Carol. Même sans connaître Carol, Alice
peut vérifier le certificat de Trent, être sûr de la clé de Carol et si sa confiance à Trent est transitif, alors elle peut aussi faire confiance à Carol pour savoir qui est Bob.
Note:
Il existe une solution intéressante pour l’authentification publique de la clé publique
l’information est le schéma web-of-trust, qui utilise des tiers
attestations de certificats auto-signés.
X.509
X.509 est une norme de l’Union internationale des télécommunications pour PKI.
Il définit entre autres le format des certificats de clé publique.
Défini sur ces RFC :
Un certificat numérique X.509 v3 a cette structure :
- Certificate
- Version
- Serial Number
- Algorithm ID
- Issuer
- Validity
- Not Before
- Not After
- Subject
- Subject public key info
- Issuer Unique Identifier (optional) - Subject Unique Identifier (optional) - Extensions (optional) - ...
- Certificate Signature Algorithm
- Certificate Signature
Version, Serial, Algorithm ID and Validity
Version - Indicates X.509 version. Should be 3 (value 0x2).
Serial - Unique positive integer assigned by the CA to each certificate.
Algorithm ID - Must be the same as the field “Certificate Signature Algorithm”
Validity - Two dates that form the period when the certificate is valid.
Issuer and Subject
Chacun a un nom distinctif (DN), unique par autorité de certification.
Un DN, décrit dans RFC1779, se compose d’une seule ligne avec ces valeurs:
- CN - CommonName
- L - LocalityName
- ST - StateOrProvinceName
- O - OrganizationName
- OU - OrganizationalUnitName
- C - CountryName
L’autorité de certification signataire peut ne pas exiger toutes les valeurs.
Lors de la connexion à un serveur HTTPS, les navigateurs vérifient la valeur CN et celle-ci
doit être conforme au domaine. Les certificats génériques commencent généralement par
un * dans le CN pour autoriser n’importe quel sous-domaine. e.g. CN=*.example.com
Notez que les navigateurs rejetteront le caractère générique pour le domaine nu, c’est-à-dire
example.com n’est pas conforme à *.example.com.
Cependant, un certificat peut être utilisé pour un serveur HTTPS qui répond sur plusieurs domaines différents.
Des domaines supplémentaires peuvent être spécifiés dans l’extension Subject Alternative Names.
Subject public key info
Contient l’algorithme de clé publique et ses paramètres spécifiques. par exemple.:
Introduit dans la version 2 pour permettre la réutilisation des noms d’émetteur et de sujet.
Par exemple, supposons qu’une Authorité de Certification fasse faillite et que son nom soit supprimé de la liste publique du pays, après un certain temps, une autre AC portant le même nom peut s’enregistrer même si elle n’est pas liée à la première.
A mon hunble avis, tout cela est très idiot. Sans surprise, l’IETF recommande de ne pas réutiliser les noms d’émetteur et de sujet.
Extensions
Introduit dans la version 3.
Une autorité de certification peut utiliser des extensions pour émettre un certificat uniquement dans un but précis,
par exemple uniquement pour les serveurs http.
Les extensions peuvent être critiques ou non critiques. Les non critiques peuvent être ignorées, tandis que
critique doit être appliquée et l’ensemble du certificat doit être rejeté si le système ne reconnaît pas une extension critique.
Quelques extensions standards :
- Subject Key Identifier
- Authority Key Identifier
- Subject Alternative Name
- Basic Constraints
Authority and Subject Key Identifiers
Utilisé lorsqu’une entité possède plusieurs clés de signature.
L’identité peut être vérifiée par le nom et le numéro de série ou par cette clé identifiant.
Un identifiant est le hachage SHA-1 160 bits de la clé publique, ou simplement le premier 60 bits précédés des bits 0100.
Subject Alternative Name
Peut contenir des noms DNS ou des adresses IP supplémentaires lorsque le certificat est valide,
c’est-à-dire en plus de celui spécifié dans CN.
Basic Constraints
Si le sujet est un CA et éventuellement la longueur maximale de profondeur de parcours de certification.
Un cas concret
Supposons que nous ayons besoin d’un certificat signé pour un serveur HTTPS.
Cela signifie que nous avons besoin d’un certificat pour le domaine (ou les domaines) où le serveur sera disponible.
Nous avons besoin d’un certificat que le navigateur peut vérifier et dire à l’utilisateur qu’il est sur les bons serveurs du domaine de l’URL qu’il a tapé et
qu’une connexion sécurisée est établie.
Les navigateurs utilisent un magasin de certificats qui contient une liste d’autorités de certification.
Pour vérifier votre vous pouvez aller dans les paramètres de votre navigateur, rechercher la section Certificats,
peut-être que dans Sécurité ou Avancé, il devrait y avoir une sorte de gestionnaire de certificats.
Le magasin de certificats du navigateur doit comporter plusieurs sections, l’une d’elles, probablement vide est pour les certificats clients, puisque HTTPS peut également authentifier le client via des certificats, bien que cela ne soit pas utilisé sauf pour certains environnements d’entreprise très spécifiques.
La section que vous souhaitez consulter est la section “Autorités” où l’autorité de certification les certificats sont stockés. Votre navigateur a très probablement des certificats de VeriSign, Comodo, GeoTrust, Microsoft, etc…
Nous avons donc besoin d’un certificat indiquant que notre clé appartient à notre domaine émis (signé) par l’une de ces entités. Ou nous pouvons aussi le faire émettre par un
entité intermédiaire, celle qui a été autorisée par l’une des AC à émettre certificats.
Si vous effectuez une recherche sur le Web pour “certificats SSL”, vous trouverez de nombreux vendeurs de certificats numériques. Vous constaterez que les certificats « génériques » sont généralement un peu plus cher.
Wildcard certificates
Un certificat générique est un certificat qui peut être utilisé avec plusieurs sous-domaines d’un domaine.
Les navigateurs recherchent le CN (nom commun) dans le champ d’objet qui doit être un domaine ou un caractère générique comme *.example.com.
Les navigateurs accepteront un certificat avec CN *.example.org pour www.example.org, login.example.org ou bo.example.org. Mais le “nu”
domaine example.org ne fonctionnera pas.
Des domaines supplémentaires (y compris le domaine nu) peuvent être ajoutés dans l’extension “SubjectAltName”.
Pour vérifier cela, dirigez votre navigateur vers https://mozilla.org (ou un autre serveur HTTPS), puis cliquez sur l’icône de verrouillage avant l’URL, il devrait y avoir un moyen pour voir le certificat utilisé. Cochez le nom commun du sujet et le extension Nom alternatif du sujet.
OpenSSL
OpenSSL est une boîte à outils de cryptographie. Contient de nombreuses sous-commandes, chacune avec sa propre page de manuel, par ex. ca(1), req(1) , x509(1).
La plupart des outils d’OpenSSL traitent les paramètres -in et -out. Habituellement, vous pouvez également inspecter les fichiers en spécifiant -in <file> et -noout,
vous aussi spécifiez quelle partie du contenu vous intéresse, pour tout voir, utilisez -text. Exemples ci-dessous.
Generate Keys and Certificate Signing Request (CSR)
Générer une clé RSA pour la CA (Authorité de Certification):
$ openssl genrsa -out example.org.key 2048Generating RSA private key, 2048 bit long modulus
.........................................+++
openssl genrsa est l’outil pour générer des clés rsa.
2048 est la taille de la clé.
Cela a créé un fichier example.org.key qui contient la clé privée.
Vous pouvez utiliser l’outil openssl rsa pour inspecter la clé.
Toute copie de la clé privée ne doit être aidée que par l’entité qui va être certifié. Cela signifie que la clé ne doit jamais être envoyée à quelqu’un d’autre,
y compris l’émetteur du certificat.
Nous générons maintenant une demande de signature de certificat qui contient certaines des informations que nous voulons être inclus dans le certificat.
Pour prouver la propriété de la clé privée, le CSR est signé avec le titulaire de la clé privée (subject's private key).
Vous êtes sur le point d’être invité à saisir des informations qui seront intégrées à votre demande de certificat.
Ce que vous êtes sur le point d’entrer est ce qu’on appelle un nom distinctif ou un DN (Distinguished Name).
Il y a pas mal de champs mais vous pouvez en laisser des vides
Pour certains champs, il y aura une valeur par défaut, Si vous entrez ‘.’, le champ sera laissé vide.
Country Name (2 letter code)[AU]:PT
State or Province Name (full name)[Some-State]:Lisboa
Locality Name (eg, city)[]:Lisboa
Organization Name (eg, company)[Internet Widgits Pty Ltd]:Example Org
Organizational Unit Name (eg, section)[]:
Common Name (e.g. server FQDN or YOUR name)[]:*.example.org
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Le certificat est ensuite envoyé à l’émetteur, et s’il approuve la demande une attestation doit être renvoyée.
Assurez-vous que votre algorithme de signature n’est pas MD5. Les anciennes configurations d’OpenSSL
ont default_md = md5 par défaut. Les navigateurs rejettent les certificats qui utilisent md5 comme algorithme de signature parce qu’il a été jugé non sécurisé.
Notez qu’il n’y a pas d’extensions, pour ajouter des extensions un fichier de configuration supplémentaire est nécessaire. Cela rend le processus un peu plus compliqué, donc lorsque vous achetez un certificat générique, vous n’avez généralement pas besoin de spécifier l’extension SubjectAltName pour le domaine nu car l’émetteur le fera pour vous.
Voici un exemple de fichier de configuration pour un CSR :
# The main section is named req because the command we are using is req
# (openssl req ...)
[ req ]
# This specifies the default key size in bits. If not specified then 512 is
# used. It is used if the -new option is used. It can be overridden by using
# the -newkey option.
default_bits = 2048
# This is the default filename to write a private key to. If not specified the
# key is written to standard output. This can be overridden by the -keyout
# option.
default_keyfile = oats.key
# If this is set to no then if a private key is generated it is not encrypted.
# This is equivalent to the -nodes command line option. For compatibility
# encrypt_rsa_key is an equivalent option.
encrypt_key = no
# This option specifies the digest algorithm to use. Possible values include
# md5 sha1 mdc2. If not present then MD5 is used. This option can be overridden
# on the command line.
default_md = sha1
# if set to the value no this disables prompting of certificate fields and just
# takes values from the config file directly. It also changes the expected
# format of the distinguished_name and attributes sections.
prompt = no
# if set to the value yes then field values to be interpreted as UTF8 strings,
# by default they are interpreted as ASCII. This means that the field values,
# whether prompted from a terminal or obtained from a configuration file, must
# be valid UTF8 strings.
utf8 = yes
# This specifies the section containing the distinguished name fields to
# prompt for when generating a certificate or certificate request.
distinguished_name = my_req_distinguished_name
# this specifies the configuration file section containing a list of extensions
# to add to the certificate request. It can be overridden by the -reqexts
# command line switch. See the x509v3_config(5) manual page for details of the
# extension section format.
req_extensions = my_extensions
[ my_req_distinguished_name ]
C = PT
ST = Lisboa
L = Lisboa
O = Oats In The Water
CN = *.oats.org
[ my_extensions ]
basicConstraints=CA:FALSE
subjectAltName=@my_subject_alt_names
subjectKeyIdentifier = hash
[ my_subject_alt_names ]
DNS.1 = *.oats.org
DNS.2 = *.oats.net
DNS.3 = *.oats.in
DNS.4 = oats.org
DNS.5 = oats.net
DNS.6 = oats.in
Notez les différents noms DNS. Étant donné que l’analyseur de configuration ne permet pas
plusieurs valeurs pour le même nom, nous utilisons le @my_subject_alt_names et
DNS.# avec des numéros différents.
Avec cette configuration, nous pouvons créer un CSR avec les extensions appropriées :
$ openssl req -new -out oats.csr -config oats.conf
Generating a 2048 bit RSA private key
.............+++
....................................+++
writing new private key to 'oats.key'-----
Parce que nous n’avons pas spécifié de clé, OpenSSL utilise les informations de notre configuration (default_bits et default_keyfile) pour en créer un.
Maintenant, nous pouvons voir qu’il y a une section Request Extensions avec notre convoité Champ Subject Alternative Name.
Une autorité de certification peut toujours supprimer ces champs ou les remplacer lors de l’émission de votre certificat.
Les inclure dans votre CSR ne garantit pas qu’ils seront dans le certificat final.
CA Key and self-signed Certificate
Jouons maintenant la partie CA.
Générez une clé pour le sujet. C’est la même chose que nous avons fait pour notre sujet.
$ openssl genrsa -out ca.key 2048Generating RSA private key, 2048 bit long modulus
......................................................+++
.......+++
e is 65537(0x10001)
Générez un certificat auto-signé pour l’autorité de certification (CA) :
$ openssl req -new -x509 -key ca.key -out ca.crt
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.
-----
Country Name (2 letter code)[AU]:PT
State or Province Name (full name)[Some-State]:Lisboa
Locality Name (eg, city)[]:Lisboa
Organization Name (eg, company)[Internet Widgits Pty Ltd]:Sz CA
Organizational Unit Name (eg, section)[]:SZ CA
Common Name (e.g. server FQDN or YOUR name)[]:
Email Address []:An optional company name []:
OpenSSL utilise les informations que vous spécifiez pour compiler un certificat X.509 à l’aide des informations demandées à l’utilisateur,
la clé publique qui est extraite de la clé privée spécifiée qui est également utilisée pour générer la signature.
Si nous souhaitons inclure des extensions dans le certificat auto-signé, nous pourrions utiliser un fichier de configuration comme nous l’avons fait pour le CSR mais nous utiliserions x509_extensions au lieu de req_extensions.
Signing
Voici un moyen très simple de signer un certificat :
Chaque certificat émis doit contenir un numéro de série unique attribué par l’AC.
Il doit être unique pour chaque certificat délivré par une autorité de certification donnée.
OpenSSL conserve les numéros de série utilisés dans un fichier, par défaut il a le même nom que le fichier de certificat CA avec l’extension a remplacer par srl.
Ainsi, un fichier nommé ca.srl est créé :
$ cat ca.srl
ED4B4A80662B1B4C
Cette commande produit le fichier example.org.crt que nous pouvons examiner :
$ openssl x509 -in example.org.crt -noout -text
Certificate:
Data:
Version: 1(0x0) Serial Number: 17098842325572590412(0xed4b4a80662b1b4c) Signature Algorithm: sha1WithRSAEncryption
Issuer: C=PT, ST=Lisboa, L=Lisboa, O=Sz CA, OU=SZ CA
Validity
Not Before: Mar 20 22:46:43 2014 GMT
Not After : Apr 19 22:46:43 2014 GMT
Subject: C=PT, ST=Lisboa, L=Lisboa, O=Example Org, CN=*.example.org
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit) Modulus:
00:ad:d8:71:1f:ab:a7:df:a6:c3:7e:d8:1f:fd:81:
b0:5a:a8:9d:51:2b:15:c2:98:95:9e:fe:3b:7c:bd:
Exponent: 65537(0x10001) Signature Algorithm: sha1WithRSAEncryption
05:21:5c:0f:4c:3c:9a:76:7f:3f:fb:fa:e0:09:03:05:c5:16:
bf:4b:ac:60:d8:86:fc:b2:42:3e:5e:19:45:2a:e2:01:83:67:
Remarquez le numéro de série, en hexadécimal est exactement le contenu du fichier créé portant le nom ca.srl.
J’ai ensuite configuré un serveur https en utilisant le certificat et la clé sur le port 1443 en utilisant bud. Bud est un terminateur TLS, c’est-à-dire qu’il extrait les connexions https entrantes et les proxies dans un serveur principal en tant que simple http. J’ai forwardé les connexions des buds vers un serveur http statique avec un index.html très simple.
J’ai également ajouté la ligne 127.0.0.1 www.example.org à mon /etc/hosts pour faire en sorte que la machine résolve le domaine sur l’adresse de loopback.
J’ai ensuite pointé mon navigateur vers https://www.example.org:1443/. Le navigateur s’est immédiatement plaint que le certificat était invalide car il n’incluait pas
la chaîne de signature. Cela signifie que le certificat indique que l’entité C=PT, ST=Lisboa, L=Lisboa, O=Example Org, CN=*.example.org est certifié par
l’entité C=PT, ST=Lisboa, L=Lisboa, O=Sz CA, OU=SZ CA mais il n’y a pas des informations sur la personne qui certifie cette deuxième entité, et puisque l’entité n’est pas
connu du navigateur, le certificat est réputé invalide.
Une chose que nous pouvons faire est de créer un autre fichier contenant le certificat de example.org et le certificat de la CA.
Aprés ça, mon navigateur, Firefox, a toujours rejeté le certificat, mais maintenant avec un message différent.
Maintenant, il se plaignait que le SZ CA n’était pas un entité de confiance.
J’ai donc ouvert les paramètres de mon navigateur et ajouté le certificat de la CA dans la Section Autorités dans le magasin de certificats.
Et maintenant ça marche !
Eh bien… Le navigateur ne donne aucun avertissement. Mais il ne montre pas l’icone vert que vous avez probablement déjà l’habitude de voir
Cela est dû à la validation étendue, une extension que nous n’avons pas incluse dans
le certificat qui exige généralement que l’autorité de certification vérifie l’identification légale du sujet. Juste pour vérifier, on peut demander au navigateur d’exporter le
certificat dans un fichier que nous pouvons interroger avec openssl :
$ openssl x509 -in github.com.crt -noout -text
Certificate:
Data:
Version: 3(0x2) Serial Number:
04:7f:be:2e:4b:de:00:84:d2:ca:f8:e3:ec:fe:70:58
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV CA-1
Validity
Not Before: Jun 10 00:00:00 2013 GMT
Not After : Sep 2 12:00:00 2015 GMT
Subject: businessCategory=Private Organization/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/serialNumber=5157550/street=548 4th Street/postalCode=94107, C=US, ST=California, L=San Francisco, O=GitHub, Inc., CN=github.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit) Modulus:
00:ed:d3:89:c3:5d:70:72:09:f3:33:4f:1a:72:74:
d9:b6:5a:95:50:bb:68:61:9f:f7:fb:1f:19:e1:da:
...
Exponent: 65537(0x10001) X509v3 extensions:
X509v3 Authority Key Identifier:
keyid:4C:58:CB:25:F0:41:4F:52:F4:28:C8:81:43:9B:A6:A8:A0:E6:92:E5
X509v3 Subject Key Identifier:
87:D1:8F:19:6E:E4:87:6F:53:8C:77:91:07:50:DF:A3:BF:55:47:20
X509v3 Subject Alternative Name:
DNS:github.com, DNS:www.github.com
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl3.digicert.com/evca1-g2.crl
Full Name:
URI:http://crl4.digicert.com/evca1-g2.crl
X509v3 Certificate Policies:
Policy: 2.16.840.1.114412.2.1
CPS: http://www.digicert.com/ssl-cps-repository.htm
User Notice:
Explicit Text:
Authority Information Access:
OCSP - URI:http://ocsp.digicert.com
CA Issuers - URI:http://cacerts.digicert.com/DigiCertHighAssuranceEVCA-1.crt
X509v3 Basic Constraints: critical
CA:FALSE
Signature Algorithm: sha1WithRSAEncryption
5f:15:6d:67:c3:3a:d5:a3:de:16:9c:45:33:26:d5:3d:c9:16:
74:34:ca:87:48:1b:14:90:6d:f5:ab:47:86:b9:f5:b8:e3:01:
...
L’extension pertinente pour Extended Validation (EV) est Certificate Policies.
Les vendeurs de certificats refuseront d’émettre des certificats génériques avec EV, car cabforum.org, l’organisme de réglementation régissant l’émission de certificats SSL EV
décidé que c’est un grand non non. Les certificats EV peuvent cependant avoir autant SubjectAltName comme vous le souhaitez.
openssl ca
Vous pouvez également signer des CSR avec le ca(1).
Nous avons d’abord besoin d’un fichier de configuration ca.conf :
# we use 'ca' as the default section because we're usign the ca command# we use 'ca' as the default section because we're usign the ca command[ ca ]default_ca= my_ca
[ my_ca ]# a text file containing the next serial number to use in hex. Mandatory.# This file must be present and contain a valid serial number.serial= ./serial
# the text database file to use. Mandatory. This file must be present though# initially it will be empty.database= ./index.txt
# specifies the directory where new certificates will be placed. Mandatory.new_certs_dir= ./newcerts
# the file containing the CA certificate. Mandatorycertificate= ./ca.crt
# the file contaning the CA private key. Mandatoryprivate_key= ./ca.key
# the message digest algorithm. Remember to not use MD5default_md= sha1
# for how many days will the signed certificate be validdefault_days=365# a section with a set of variables corresponding to DN fieldspolicy= my_policy
[ my_policy ]# if the value is "match" then the field value must match the same field in the# CA certificate. If the value is "supplied" then it must be present.# Optional means it may be present. Any fields not mentioned are silently# deleted.countryName= match
stateOrProvinceName= supplied
organizationName= supplied
commonName= supplied
organizationalUnitName= optional
commonName= supplied
[ ca ]default_ca= my_ca
[ my_ca ]# a text file containing the next serial number to use in hex. Mandatory.# This file must be present and contain a valid serial number.serial= ./serial
# the text database file to use. Mandatory. This file must be present though# initially it will be empty.database= ./index.txt
# specifies the directory where new certificates will be placed. Mandatory.new_certs_dir= ./newcerts
# the file containing the CA certificate. Mandatorycertificate= ./ca.crt
# the file contaning the CA private key. Mandatoryprivate_key= ./ca.key
# the message digest algorithm. Remember to not use MD5default_md= sha1
# for how many days will the signed certificate be validdefault_days=365# a section with a set of variables corresponding to DN fieldspolicy= my_policy
[ my_policy ]# if the value is "match" then the field value must match the same field in the# CA certificate. If the value is "supplied" then it must be present.# Optional means it may be present. Any fields not mentioned are silently# deleted.countryName= match
stateOrProvinceName= supplied
organizationName= supplied
commonName= supplied
organizationalUnitName= optional
commonName= supplied
N’oubliez pas que vous pouvez utiliser man ca non seulement pour voir des détails sur les options et les commandes, mais aussi sur les sections de configuration ainsi que les paramètres correspondants.
Nous devons d’abord mettre en place une structure. Le fichier de configuration attend un répertoire newcerts et les fichiers index.txt et serial :
$ mkdir newcerts
$ touch index.txt
$ echo'01' > serial
Et maintenant nous pouvons enfin signer le certificat :
$ openssl ca -config ca.cnf -out example.org.crt -infiles example.org.csr
Using configuration from ca.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'PT'
stateOrProvinceName :ASN.1 12:'Lisboa'
localityName :ASN.1 12:'Lisboa'
organizationName :ASN.1 12:'Example Org'
commonName :ASN.1 12:'*.example.org'Certificate is to be certified until Mar 21 01:13:36 2015 GMT (365 days)Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Si nous souhaitons ajouter des extensions, voire conserver les extensions envoyées dans un CSR
(openssl les supprimera lors de la signature), alors nous devons également inclure cette configuration.
Ceci est un fichier de configuration supplémentaire oats.extensions.cnf :
$ openssl ca -config ca.cnf -out oats.crt -extfile oats.extensions.cnf -in oats.csr
Using configuration from ca.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'PT'
stateOrProvinceName :PRINTABLE:'Lisboa'
localityName :PRINTABLE:'Lisboa'
organizationName :PRINTABLE:'Oats In The Water'
commonName :T61STRING:'*.oats.org'Certificate is to be certified until Mar 21 01:43:11 2015 GMT (365 days)Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Nous avons un certificat qui inclut les SubjectAltNames que nous voulions :
$ openssl x509 -in oats.crt -noout -text
Certificate:
Data:
Version: 3(0x2) Serial Number: 2(0x2) Signature Algorithm: sha1WithRSAEncryption
Issuer: C=PT, ST=Lisboa, L=Lisboa, O=Sz CA, OU=SZ CA
Validity
Not Before: Mar 21 01:43:11 2014 GMT
Not After : Mar 21 01:43:11 2015 GMT
Subject: C=PT, ST=Lisboa, O=Oats In The Water, CN=*.oats.org
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit) Modulus:
00:a2:58:fc:57:32:4d:40:aa:62:92:65:86:1d:6b:
4f:3e:11:a6:b5:36:f2:48:d2:23:2a:8f:bb:a0:a4:
...
Exponent: 65537(0x10001) X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Alternative Name:
DNS:*.oats.org, DNS:*.oats.net, DNS:*.oats.in, DNS:oats.org, DNS:oats.net, DNS:oats.in
X509v3 Subject Key Identifier:
C6:0E:59:B3:1A:FF:1A:A2:FF:F3:DC:76:21:F0:92:FC:57:88:05:6D
Signature Algorithm: sha1WithRSAEncryption
89:7e:7d:67:1e:98:85:78:a1:f2:81:4c:b4:8c:f9:80:cd:47:
a9:94:94:a3:f0:dd:36:d3:e3:48:93:77:4a:31:16:03:79:9c:
...
Nous pouvons vérifier que le certificat est correct :
$ openssl verify -CAfile ca.crt oats.crt
oats.crt: OK
That is all
Je sais qu’il y a beaucoup de choses que je n’ai pas couvertes, des choses importantes comme les CRL.