ca(1) Application minimale d'autorité de certification

SYNOPSIS

openssl ca [-verbose] [-config nom_fichier] [-name section] [-gencrl] [-revoke nom_fichier] [-status série] [-updatedb] [-crl_reason raison] [-crl_hold instruction] [-crl_compromise moment] [-crl_CA_compromise moment] [-crldays nombre] [-crlhours nombre] [-crlexts section] [-startdate date] [-enddate date] [-days param] [-md alg] [-policy arg] [-keyfile nom_fichier] [-keyform PEM|DER] [-key mot_de_passe] [-passin param] [-cert fichier] [-selfsign] [-in nom_fichier] [-out nom_fichier] [-notext] [-outdir répertoire] [-infiles] [-spkac nom_fichier] [-ss_cert nom_fichier] [-preserveDN] [-noemailDN] [-batch] [-msie_hack] [-extensions section] [-extfile section] [-engine id] [-subj param] [-utf8] [-multivalue-rdn]

DESCRIPTION

La commande ca est une application d'autorité de certification (CA pour « Certificate Authority ») minimale. Elle peut être utilisée pour signer des demandes de certificats sous différentes formes et génère des listes de révocations de certificat (CRL pour « Certificate Revocation List »). D'autre part, elle maintient une liste des certificats délivrés et de leur état.

Les descriptions des options sont divisées par type d'action.

OPTIONS POUR LES AUTORITÉS DE CERTIFICATION

-config nom_fichier
Indiquer le nom du fichier de configuration.
-name section
Indiquer la section du fichier de configuration à utiliser (remplace default_ca dans la section ca).
-in nom_fichier
Un nom de fichier en entrée contenant une seule demande de certificat à signer par l'autorité de certification.
-ss_cert nom_fichier
Un seul certificat autosigné à signer par l'autorité de certification.
-spkac nom_fichier
Un fichier contenant une unique clef publique Netscape signée, un défi (challenge) et des données supplémentaires à signer par l'autorité de certification. Consultez la section FORMAT SPKAC pour des informations sur le format d’entrée et sortie demandé.
-infiles
Si elle est présente, ce doit être la dernière option. Tous les paramètres suivants sont interprétés comme des noms de fichiers contenant des demandes de certificat.
-out nom_fichier
Le fichier de sortie où les certificats seront dirigés. Par défaut il s'agit de la sortie standard. Les détails des certificats y seront également précisés au format PEM (sauf que -spkac utilise le format DER en sortie).
-outdir répertoire
Le répertoire qui contiendra les certificats. Les certificats seront écrits vers des fichiers nommés par le numéro de série en hexadécimal portant le suffixe « .pem ».
-cert
Le fichier de certificat de l'autorité de certification.
-keyfile nom_fichier
La clef privée avec laquelle signer les demandes.
-keyform PEM|DER
Le format des données du ficher de clef privée (PEM par défaut).
-key mot_de_passe
Le mot de passe utilisé pour chiffrer la clef privée. Sur certains systèmes les paramètres de la ligne de commande sont visibles (par exemple sous UNIX avec l'utilitaire « ps »), une certaine prudence est donc nécessaire en utilisant de cette option.
-selfsign
Indiquer que les certificats émis sont à signer avec la clef utilisée pour signer les demandes de certificat (donnée avec -keyfile). Les demandes de certificat signées avec une clef différente sont ignorés. Si -spkac, -ss_cert ou -gencrl sont donnés, -selfsign est ignoré.

Une des conséquences d'utiliser -selfsign est que le certificat autosigné apparaît parmi les entrées de la base de données de certificats (consultez l'option de configuration database), et utilise le même compteur de numéro de série que tous les autres certificats signés avec le même certificat autosigné.

-passin param
La source du mot de passe de la clef. Pour plus d'informations sur le format de param, consultez la section PARAMÈTRES DE PHRASE SECRÈTE d'openssl(1).
-verbose
Afficher des précisions supplémentaires sur les opérations effectuées.
-notext
Ne pas inclure la version texte d'un certificat dans le fichier de sortie.
-startdate date
Définir la date de début de validité explicitement. Le format de date utilisé est AAMMJJHHMMSSZ (comme pour une structure UTCTime ASN1).
-enddate date
Définir la date de fin de validité explicitement. Le format de date utilisé est AAMMJJHHMMSSZ (comme pour une structure UTCTime ASN1).
-days param
La durée en jour pendant laquelle le certificat sera certifié.
-md alg
Le type de hachage (« digest ») de message à utiliser. md5, sha1 et mdc2 font partie des valeurs possibles. Cette option s'applique aussi aux listes de révocations de certificat.
-policy param
Cette option définit la « politique » d'autorité de certification à utiliser. Il s'agit d'une section du fichier de configuration indiquant les champs qui sont obligatoires ou qui doivent correspondre au certificat de l'autorité de certification. Consultez la section FORMAT DES POLITIQUES pour plus d'informations.
-msie_hack
C'est une option de compatibilité ascendante pour faire fonctionner ca avec les très vieilles versions du Certificate Enrollment Control « certenr3 » d'IE. Elle utilise UniversalStrings pour presque tout. Puisque l'ancien centre de contrôle est victime de plusieurs bogues de sécurité, son utilisation est fortement déconseillée. Le centre de contrôle plus récent « Xenroll » n'a pas besoin de cette option.
-preserveDN
Normalement, l'ordre des DN d'un certificat est le même que l'ordre des champs dans la section de politique. Quand l'option est définie, l'ordre est le même que celui de la demande. C'est surtout par compatibilité avec l'ancien Enrollment Control d'IE qui n'acceptait les certificats que si leurs DN correspondaient à l'ordre de la demande. Ce n'est plus nécessaire avec Xenroll.
-noemailDN
Le DN d'un certificat peut contenir le champ EMAIL s'il est présent dans le DN de la demande, cependant c'est une bonne politique de n'avoir que l'adresse électronique configurée dans l'extension altName du certificat. Quand cette option est définie, le champ EMAIL est retiré de l'objet du certificat et défini seulement dans les extensions éventuellement présentes. Le mot-clef email_in_dn peut être utilisé dans le fichier de configuration pour activer ce comportement.
-batch
Activer le mode par lot. Aucune question ne sera posée et tous les certificats seront signés automatiquement.
-extensions section
La section du fichier de configuration contenant les extensions de certificat à ajouter lors de l'émission d'un certificat (x509_extensions par défaut si l'option -extfile n'est pas utilisée). Si aucune section n'est présente, un certificat V1 est créé. Si la section d'extensions est présente (même vide), un certificat V3 est créé. Consultez la page de manuel x509v3_config(5) pour obtenir des précisions sur le format de section d'extensions.
-extfile fichier
Un fichier de configuration supplémentaire pour y lire les extensions de certificat (en utilisant la section par défaut si l'option -extensions n'est pas présente).
-engine id
Indiquer un moteur (en utilisant son identifiant unique id) qui force ca à essayer d'obtenir une référence fonctionnelle pour le moteur indiqué, et l'initialiser si nécessaire. Le moteur sera ensuite utilisé par défaut pour tous les algorithmes disponibles.
-subj param
Remplacer le nom de sujet donné dans la demande. param doit être formaté comme /type0=valeur0/type1=valeur1/type2=... où les caractères peuvent être protégées par « \ » (barre oblique inversée), aucun espace n'est ignoré.
-utf8
Cette option indique que les valeurs des champs doivent être interprétées comme des chaînes UTF-8. Par défaut, elles sont interprétées comme des chaînes ASCII. Cela signifie que les valeurs des champs, qu'elles soient demandées sur le terminal ou fournies par le fichier de configuration, doivent être des chaînes UTF-8 valables.
-multivalue-rdn
Cette option force l'argument de -subj à être interprété avec une prise en charge complète des RDN multivaleurs. Exemple :

/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=Jean Dupont

Si -multi-rdn est utilisée, alors la valeur de l'UID est 123456+CN=Jean Dupont.

OPTIONS POUR LES LISTES DE RÉVOCATIONS DE CERTIFICAT (CRL)

-gencrl
Cette option génère une liste de révocations de certificat basée sur les renseignements du fichier d'index.
-crldays nombre
Le nombre de jours avant passage à la liste de révocations de certificat suivante. Ce nombre de jours, qui est décompté à partir de la date d'exécution, permet de définir la date à placer dans le champ nextUpdate de la liste de révocations de certificat.
-crlhours nombre
Le nombre d'heures avant passage à la liste de révocations de certificat suivante.
-revoke nom_fichier
Le nom du fichier contenant un certificat à retirer.
-status série
Afficher l’état de révocation du certificat avec le numéro de série indiqué et quitter.
-updatedb
Mettre à jour l’index de la base de donnée pour purger les certificats expirés.
-crl_reason raison
La raison du retrait, où la raison vaut : unspecified (« non précisée »), keyCompromise (« clef compromise »), CACompromise (« autorité de certification compromise »), affiliationChanged (« changement d'affiliation »), superseded (« remplacé »), cessationOfOperation (« cessation d'activité »), certificateHold (« certificat suspendu ») ou removeFromCRL (« retiré de la liste de révocations de certificat »). La casse de la raison n'a pas besoin de correspondre. L'ajout d'une raison au retrait forcera l'utilisation d'une CRL v2.

En pratique, removeFromCRL n'est pas particulièrement utile parce qu'elle n'est utilisée que pour les listes de révocations de certificat « delta », qui ne sont pas implémentées pour l'instant.

-crl_hold instruction
Définir le code de raison de révocation d'une liste de révocations de certificat à certificateHold et l'instruction de suspension à instruction qui doit être un OID. Même si n'importe quel OID peut être utilisé, seuls holdInstructionNone (dont l'utilisation est déconseillée par la RFC 2459), holdInstructionCallIssuer ou holdInstructionReject seront normalement utilisés.
-crl_compromise moment
Définir la raison de révocation à keyCompromise et la date de la compromission à moment. moment doit être au format GeneralizedTime, c'est-à-dire AAAAMMDDHHMMSSZ.
-crl_CA_compromise moment
Il s'agit de la même chose que crl_compromise, mais la raison de révocation est définie à CACompromise.
-crlexts section
La section du fichier de configuration contenant des extensions CRL à inclure. Si aucune section d'extension CRL n'est présente, une CRL V1 est créée, sinon une CRL V2 sera créée, même si la section en question est vide. Les extensions CRL indiquées sont des extensions CRL et non des extensions d'entrée CRL. Remarquez que certains logiciels (par exemple Netscape) ne gèrent pas les CRL V2. Consultez la page de manuel x509v3_config(5) pour obtenir des précisions sur le format de section d'extensions.

OPTIONS DU FICHIER DE CONFIGURATION

La section du fichier de configuration contenant des options pour ca est trouvée de la façon suivante : si l'option de ligne de commande -name est utilisée, elle précise le nom de la section à utiliser. Autrement, la section qui sera utilisée est celle mentionnée l'option default_ca de la section ca du fichier de configuration (ou dans la section par défaut du fichier de configuration). À part default_ca, les options suivantes sont lues directement dans la section ca :
 RANDFILE preserve
 msie_hack

À l'exception de RANDFILE, c'est probablement un bogue et cela risque d'être modifié dans les prochaines versions.

De nombreuses options du fichier de configuration sont identiques à celles de la ligne de commande. Si une option est présente à la fois dans le fichier de configuration et sur la ligne de commande, la valeur de la ligne de commande est prise en compte. Une option décrite comme obligatoire doit être présente soit dans le fichier de configuration soit sur la ligne de commande (si c'est possible).

oid_file
Indiquer le fichier contenant des IDENTIFIANTS D'OBJET supplémentaires. Chaque ligne est constituée de la forme numérique de l'identifiant d'objet suivie d'un espace puis du libellé court suivi à son tour d'un espace et finalement du libellé long.
oid_section
Indiquer une section du fichier de configuration contenant d'autres identifiants d'objet. Chaque ligne est constituée du libellé court de l'identifiant d'objet suivi de = et de la forme numérique. Le libellé court et le libellé long sont identiques quand cette option est utilisée.
new_certs_dir
Identique à l'option de ligne de commande -outdir. Elle indique le répertoire où les nouveaux certificats seront placés. Obligatoire.
certificate
Identique à -cert. Elle indique le fichier contenant le certificat de l'autorité de certification. Obligatoire.
private_key
Identique à l'option -keyfile. Le fichier contenant la clef privée de l'autorité de certification. Obligatoire.
RANDFILE
Un fichier utilisé pour lire et écrire les renseignements initiateurs de nombre aléatoire ou une socket EGD (consultez RAND_egd(3)).
default_days
Identique à l'option -days. La durée en jour pendant laquelle le certificat sera certifié.
default_startdate
Identique à l'option -startdate. La date de début de validité du certificat. Si cette option est absente, la date actuelle sera utilisée.
default_enddate
Identique à l'option -enddate. Soit cette option, soit default_days (où les équivalents en ligne de commande) doivent être présent.
default_crl_hours default_crl_days
Identiques aux options -crlhours et -crldays. Uniquement utilisées si aucune des options n'est présente sur la ligne de commande. Au moins une de ces options doit être indiquée pour générer une liste de révocations de certificat.
default_md
Identique à l'option -md. Le type de condensé de message à utiliser. Obligatoire.
database
Le fichier texte (base de données) à utiliser. Obligatoire. Ce fichier doit être présent même s'il est initialement vide.
unique_subject
Si la valeur yes est donnée, les entrées valables de certificat dans la base de données doivent avoir des objets uniques. Si la valeur no est donnée, plusieurs entrées valables de certificat peuvent avoir les mêmes objets. La valeur par défaut est yes, par compatibilité avec les plus anciennes versions d'OpenSSL (avant 0.9.8). Cependant, pour faciliter le remplacement des certificats d'autorité de certification, l'utilisation de la valeur no est recommandée, en particulier si combinée avec l'option -selfsign de la ligne de commande.
serial
Un fichier texte contenant le prochain numéro de série à utiliser en hexadécimal. Obligatoire. Ce fichier doit être présent et contenir un numéro de série valable.
crlnumber
Un fichier texte contenant le prochain numéro de liste de révocations de certificat à utiliser en hexadécimal. Le numéro ne sera inséré dans les listes de révocations de certificat que si le fichier existe. Si ce fichier est présent, il doit contenir un numéro valable de liste de révocations de certificat.
x509_extensions
Identique à -extensions.
crl_extensions
Identique à -crlexts.
preserve
Identique à -preserveDN.
email_in_dn
Identique à -noemailDN. Si vous voulez que le champ EMAIL soit supprimé du DN du certificat, définissez-le simplement à « no ». S'il n'est pas présent, le champ EMAIL sera permis dans le DN du certificat par défaut.
msie_hack
Identique à -msie_hack.
policy
Identique à -policy. Obligatoire. Consultez la section FORMAT DES POLITIQUES pour plus de renseignements.
name_opt, cert_opt
Ces options permettent au format utilisé d'afficher les précisions du certificat lors de la demande de confirmation de signature à l'utilisateur. Tous les paramètres pris en charge par les options -nameopt et -certopt des utilitaires x509 peuvent être utilisés ici, sauf que no_signame et no_sigdump sont définis de façon permanente et ne peuvent pas être désactivés (parce que le certificat n'a pas été signé à ce moment, donc la signature du certificat ne peut pas être affichée).

Par commodité, les valeurs ca_default sont acceptées par les deux pour produire une sortie raisonnable.

Si aucune option n'est présente, le format utilisé dans les versions précédentes d'OpenSSL est utilisé. L'utilisation de l'ancien format est fortement déconseillée, parce qu'il n'affiche que les champs mentionnés dans la section policy, ne gère pas correctement les types de chaîne multicaractère et n'affiche pas les extensions.

copy_extensions
Déterminer la façon de traiter les extensions des demandes de certificat. Si définie à none, ou si cette option n'est pas présente, alors les extensions sont ignorées et ne sont pas copiées vers le certificat. Si définie à copy, toutes les extensions présentes dans la demande qui ne sont pas déjà présentes sont copiées vers le certificat. Si définie à copyall, toutes les extensions de la demande sont copiées vers le certificat : si l'extension est déjà présente dans le certificat, elle est d'abord supprimée. Consultez la section AVERTISSEMENTS avant d'utiliser cette option.

L'utilisation principale de cette option est de permettre à une demande de certificat de fournir des valeurs pour certaines extensions comme subjectAltName.

FORMAT DES POLITIQUES

La section policy consiste en un jeu de variables qui correspondent aux champs DN du certificat. Si la valeur est « match », la valeur du champ doit être identique au champ du même nom du certificat de l'autorité de certification. Si la valeur est « supplied », il doit être présent. Si la valeur est « optional », sa présence n'est pas obligatoire. Tout champ ne figurant pas dans la section policy est supprimé à moins que l'option -preserveDN ne soit activée, mais c'est plus une bizarrerie qu'un comportement attendu.

FORMAT SPKAC

L'entrée fournie à la ligne de commande -spkac est une clef publique signée Netscape et un défi. Cela provient habituellement d'une balise KEYGEN dans un formulaire HTML pour créer une nouvelle clef privée. Il est toutefois possible de créer des SPKAC en utilisant l'utilitaire spkac.

Le fichier devrait contenir la variable SPKAC avec la valeur de la clef SPARK ainsi que les éléments DN sous forme de paires nom-valeurs. Si besoin est d'inclure le même élément plusieurs fois, il est possible de le faire précéder par un nombre et un « . ».

Lors du traitement du format SPKAC, la sortie est au format DER si l’attribut -out est utilisé, mais au format PEM si elle est envoyée vers la sortie standard ou que l’attribut -outdir est utilisé.

EXEMPLES

Note : ces exemples supposent que l'arborescence ca est déjà en place et que les fichiers liés existent. Cela nécessite généralement la création d'un certificat et d'une clef privée pour l'autorité de certification avec req, un fichier de numéro de série et un fichier d'index vide. Tous ces fichiers doivent être placés dans les répertoires correspondants.

Afin d'utiliser le fichier de configuration type ci-dessous, il faut créer les répertoires demoCA, demoCA/prive et demoCA/nouvcerts. Le certificat de l'autorité de certification doit être copié dans demoCA/certca.pem et sa clef privée dans demoCA/prive/clefca.pem. Un fichier demoCA/serie doit être créé contenant par exemple « 01 » et un fichier d'index vide doit être créé dans demoCA/index.txt.

Signer une demande de certificat :

 openssl ca -in dem.pem -out nouvcert.pem

Signer une demande de certificat utilisant des extensions d'autorité de certification :

 openssl ca -in dem.pem -extensions v3_ca -out nouvcert.pem

Générer une liste de révocations de certificat :

 openssl ca -gencrl -out crl.pem

Signer plusieurs demandes :

 openssl ca -infiles dem1.pem dem2.pem dem3.pem

Certifier un SPKAC Netscape :

 openssl ca -spkac spkac.txt

Un fichier SPKAC type (lignes tronquées pour la lisibilité) :

 SPKAC=MIG0MGAwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAn7PDhCeV/xIxUg8V70YRxK2A5
 CN=Steve Test
 [email protected]
 0.OU=Groupe OpenSSL
 1.OU=Un autre groupe

Un fichier de configuration type avec les sections pour ca :

 [ ca ]
 default_ca      = CA_defaut            # la section ca par défaut
 
 [ CA_defaut ]
 dir            = ./demoCA              # répertoire principal
 database       = $dir/index.txt        # fichier index
 new_certs_dir  = $dir/nouvcerts        # rép. nouveaux certificats
 
 certificate    = $dir/certca.pem       # le certificat de la CA
 serial         = $dir/serie            # fichier de numéro de série
 private_key    = $dir/prive/clefca.pem # clef privée de la CA
 RANDFILE       = $dir/prive/.alea      # fichier de numéro aléatoire
 
 default_days   = 365                   # durée de certification
 default_crl_days= 30                   # durée avant la prochaine CRL
 default_md     = md5                   # hachage à utiliser
 policy         = politique_def         # politique par défaut
 email_in_dn    = no                    # pas d'adresse élec. dans le DN
 name_opt       = ca_default            # option d'aff. de nom de sujet
 cert_opt       = ca_default            # option d'aff. de certificat
 copy_extensions = none                 # sans copie d'extensions de dem.
 [ politique_def ]
 countryName            = supplied
 stateOrProvinceName    = optional
 organizationName       = optional
 organizationalUnitName = optional
 commonName             = supplied
 emailAddress           = optional

FICHIERS

Note : l'emplacement de tous les fichiers peut changer en fonction des options de compilation, des entrées dans le fichier de configuration, des variables d'environnement ou des options de la ligne de commande. Les valeurs ci-dessous sont les valeurs par défaut.

 /usr/local/ssl/lib/openssl.cnf - fichier de configuration maître
 ./demoCA                       - répertoire principal de la CA
 ./demoCA/cacert.pem            - certificat de la CA
 ./demoCA/private/cakey.pem     - clef privée de la CA
 ./demoCA/serial                - fichier des numéros de série de la CA
 ./demoCA/serial.old            - sauvegarde de ./demoCA/serial
 ./demoCA/index.txt             - base de données en texte de la CA
 ./demoCA/index.txt.old         - sauvegarde de ./demoCA/index.txt
 ./demoCA/certs                 - fichier de sortie du certificat
 ./demoCA/.rnd                  - graine pour l'aléa de la CA

VARIABLES D'ENVIRONNEMENT

OPENSSL_CONF contient l'emplacement du fichier de configuration principal qui peut être modifié avec l'option en ligne de commande -config.

RESTRICTIONS

Le fichier d'index est une partie cruciale du processus et toute corruption peut s'avérer difficile à rattraper. Bien qu'il soit possible théoriquement de reconstruire l'index à partir des certificats délivrés et d'une liste de révocations de certificat récente, aucune option ne permet de faire cela.

Les fonctionnalités des CRL V2 telles que la prise en charge des delta CRL ne sont pas gérées actuellement.

Même s'il est possible d'entrer et de traiter plusieurs demandes en même temps, il est impossible d'inclure plus d'un SPKAC ou certificat autosigné.

BOGUES

L'utilisation d'une base de données texte en mémoire peut s'avérer problématique, en particulier avec un nombre important de certificats à gérer, justement du fait que cette base se trouve en mémoire.

La commande ca a réellement besoin d'être réécrite ou les fonctionnalités nécessaires devraient être fournie par une commande ou interface pour permettre à des utilitaires plus orientés utilisateurs (scripts Perl ou interface graphique) de traiter les choses correctement. Les scripts CA.sh et CA.pl aident un petit peu en ce sens.

Tous les champs d'une demande qui ne sont pas présents dans la politique sont supprimés silencieusement. Cela n'arrive pas si l'option -preserveDN est utilisée. Pour renforcer l'absence du champ EMAIL dans le DN, conformément aux suggestions des RFC, quelque soit le contenu de l'objet de la demande, l'option -noemailDN peut être utilisée. Le comportement devrait être plus simple et configurable.

L'annulation de certaines commandes en refusant de certifier un certificat peut résulter en un fichier vide.

AVERTISSEMENTS

La commande ca est capricieuse et parfois peu facile d'utilisation.

La commande ca a eu pour objectif initial d'être un exemple montrant comment se servir d'une autorité de certification. Elle n'a pas été créée pour servir d'application pour une autorité de certification complète, cependant certaines personnes s'en servent dans ce but.

La commande ca est effectivement une commande mono-utilisateur, aucun verrouillage n'est fait sur les divers fichiers, et des tentatives d'accès simultanées à un même fichier d'index peuvent produire des résultats imprévisibles.

L'option copy_extensions devrait être utilisée avec précaution. Un risque de sécurité est possible si l'attention nécessaire n'est pas fournie. Par exemple, si une demande de certificat contient une extension basicConstraints avec CA:TRUE et que la valeur copy_extensions est définie à copyall et que l'utilisateur ne s'en rend pas compte quand le certificat est affiché, alors cela fournira au demandeur un certificat d'autorité de certification valable.

Cette situation peut être évitée en définissant copy_extensions à copy et en incluant basicConstraints avec CA:FALSE dans le fichier de configuration. Dans ce cas, si la demande contient une extension basicConstraints, elle sera ignorée.

Il est aussi conseillé d'inclure les valeurs pour les autres extensions comme keyUsage pour éviter qu'une demande fournisse ses propres valeurs.

Des restrictions supplémentaires peuvent être ajoutées au certificat de l'autorité de certification lui-même. Par exemple si le certificat de l'autorité de certification contient :

 basicConstraints = CA:TRUE, pathlen:0

alors même si un certificat est émis avec CA:TRUE, il ne sera pas valable.

TRADUCTION

Cette page de manuel a été traduite par stolck en 2002 et est maintenue par la liste <debian-l10n-french AT lists DOT debian DOT org>. Veuillez signaler toute erreur de traduction par un rapport de bogue sur le paquet manpages-fr-extra.