1999-11-10 02:52:17 +00:00
|
|
|
|
|
|
|
=pod
|
|
|
|
|
|
|
|
=head1 NAME
|
|
|
|
|
|
|
|
x509 - Certificate display and signing utility
|
|
|
|
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
|
|
|
|
B<openssl> B<x509>
|
|
|
|
[B<-inform DER|PEM|NET>]
|
|
|
|
[B<-outform DER|PEM|NET>]
|
|
|
|
[B<-keyform DER|PEM>]
|
|
|
|
[B<-CAform DER|PEM>]
|
|
|
|
[B<-CAkeyform DER|PEM>]
|
|
|
|
[B<-in filename>]
|
|
|
|
[B<-out filename>]
|
|
|
|
[B<-serial>]
|
|
|
|
[B<-hash>]
|
|
|
|
[B<-subject>]
|
|
|
|
[B<-issuer>]
|
|
|
|
[B<-startdate>]
|
|
|
|
[B<-enddate>]
|
|
|
|
[B<-purpose>]
|
|
|
|
[B<-dates>]
|
|
|
|
[B<-modulus>]
|
|
|
|
[B<-fingerprint>]
|
|
|
|
[B<-alias>]
|
|
|
|
[B<-noout>]
|
|
|
|
[B<-trustout>]
|
|
|
|
[B<-clrtrust>]
|
|
|
|
[B<-clrnotrust>]
|
|
|
|
[B<-addtrust arg>]
|
|
|
|
[B<-addnotrust arg>]
|
|
|
|
[B<-setalias arg>]
|
|
|
|
[B<-days arg>]
|
|
|
|
[B<-signkey filename>]
|
|
|
|
[B<-x509toreq>]
|
|
|
|
[B<-req>]
|
|
|
|
[B<-CA filename>]
|
|
|
|
[B<-CAkey filename>]
|
|
|
|
[B<-CAcreateserial>]
|
|
|
|
[B<-CAserial filename>]
|
|
|
|
[B<-text>]
|
|
|
|
[B<-C>]
|
|
|
|
[B<-md2|-md5|-sha1|-mdc2>]
|
|
|
|
[B<-clrext>]
|
|
|
|
[B<-extfile filename>]
|
|
|
|
[B<-extensions section>]
|
|
|
|
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
|
|
|
|
The B<x509> command is a multi purpose certificate utility. It can be
|
|
|
|
used to display certificate information, convert certificates to
|
|
|
|
various forms, sign certificate requests like a "mini CA" or edit
|
|
|
|
certificate trust settings.
|
|
|
|
|
|
|
|
Since there are a large number of options they will split up into
|
|
|
|
various sections.
|
|
|
|
|
|
|
|
|
|
|
|
=head1 INPUT AND OUTPUT OPTIONS
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|
|
|
|
=item B<-inform DER|PEM|NET>
|
|
|
|
|
|
|
|
This specifies the input format normally the command will expect an X509
|
|
|
|
certificate but this can change if other options such as B<-req> are
|
|
|
|
present. The DER format is the DER encoding of the certificate and PEM
|
|
|
|
is the base64 encoding of the DER encoding with header and footer lines
|
|
|
|
added. The NET option is an obscure Netscape server format that is now
|
|
|
|
obsolete.
|
|
|
|
|
|
|
|
=item B<-outform DER|PEM|NET>
|
|
|
|
|
|
|
|
This specifies the output format, the options have the same meaning as the
|
|
|
|
B<-inform> option.
|
|
|
|
|
|
|
|
=item B<-in filename>
|
|
|
|
|
|
|
|
This specifies the input filename to read a certificate from or standard input
|
|
|
|
if this option is not specified.
|
|
|
|
|
|
|
|
=item B<-out filename>
|
|
|
|
|
|
|
|
This specifies the output filename to write to or standard output by
|
|
|
|
default.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
=head1 DISPLAY OPTIONS
|
|
|
|
|
|
|
|
Note: the B<-alias> and B<-purpose> options are also display options
|
|
|
|
but are desribed in the B<TRUST OPTIONS> section.
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|
|
|
|
=item B<-text>
|
|
|
|
|
|
|
|
prints out the certificate in text form. Full details are output including the
|
|
|
|
public key, signature algorithms, issuer and subject names, serial number
|
|
|
|
any extensions present and any trust settings.
|
|
|
|
|
|
|
|
=item B<-noout>
|
|
|
|
|
|
|
|
this option prevents output of the encoded version of the request.
|
|
|
|
|
|
|
|
=item B<-modulus>
|
|
|
|
|
|
|
|
this option prints out the value of the modulus of the public key
|
|
|
|
contained in the certificate.
|
|
|
|
|
|
|
|
=item B<-serial>
|
|
|
|
|
|
|
|
outputs the certificate serial number.
|
|
|
|
|
|
|
|
=item B<-hash>
|
|
|
|
|
1999-11-13 21:28:01 +00:00
|
|
|
outputs the "hash" of the certificate subject name. This is used in OpenSSL to
|
|
|
|
form an index to allow certificates in a directory to be looked up by subject
|
1999-11-10 02:52:17 +00:00
|
|
|
name.
|
|
|
|
|
|
|
|
=item B<-subject>
|
|
|
|
|
|
|
|
outputs the subject name.
|
|
|
|
|
|
|
|
=item B<-issuer>
|
|
|
|
|
|
|
|
outputs the issuer name.
|
|
|
|
|
|
|
|
=item B<-startdate>
|
|
|
|
|
|
|
|
prints out the start date of the certificate, that is the notBefore date.
|
|
|
|
|
|
|
|
=item B<-enddate>
|
|
|
|
|
|
|
|
prints out the expiry date of the certificate, that is the notAfter date.
|
|
|
|
|
|
|
|
=item B<-dates>
|
|
|
|
|
|
|
|
prints out the start and expiry dates of a certificate.
|
|
|
|
|
|
|
|
=item B<-fingerprint>
|
|
|
|
|
|
|
|
prints out the MD5 digest of the whole certificate.
|
|
|
|
|
|
|
|
=item B<-C>
|
|
|
|
|
|
|
|
this outputs the certificate in the form of a C source file.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
=head1 TRUST SETTINGS
|
|
|
|
|
|
|
|
Please note these options are currently experimental and may well change.
|
|
|
|
|
|
|
|
A B<trusted certificate> is an ordinary certificate which has several
|
|
|
|
additional pieces of information attached to it such as the permitted
|
|
|
|
and prohibited uses of the certificate and an "alias".
|
|
|
|
|
|
|
|
Normally when a certificate is being verified at least one certificate
|
|
|
|
must be "trusted". By default a trusted certificate must be stored
|
|
|
|
locally and must be a root CA: any certificate chain ending in this CA
|
|
|
|
is then usable for any purpose.
|
|
|
|
|
|
|
|
Adding trust settings modifies this behaviour: if a certificate is being
|
|
|
|
verified and one of the certificate chain is marked as trusted for that
|
|
|
|
specific purpose then the verify succeeds without looking up any more
|
|
|
|
certificates. Similarly if the use is prohibited then the certificate
|
|
|
|
is automatically rejected. If a purpose is neither permitted nor prohibited
|
|
|
|
then the certificate extensions are checked for consistency with the required
|
|
|
|
purpose and the process continues.
|
|
|
|
|
|
|
|
If a root CA is reached then it must be marked as trusted for the required
|
|
|
|
purpose or the verify fails.
|
|
|
|
|
|
|
|
See the description of the B<verify> utility for more information on the
|
|
|
|
meaning of trust settings.
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|
|
|
|
=item B<-trustout>
|
|
|
|
|
|
|
|
this causes B<x509> to output a B<trusted> certificate. An ordinary
|
|
|
|
or trusted certificate can be input but by default an ordinary
|
|
|
|
certificate is output and any trust settings are discarded. With the
|
|
|
|
B<-trustout> option a trusted certificate is output. A trusted
|
|
|
|
certificate is automatically output if any trust settings are modified.
|
|
|
|
|
|
|
|
=item B<-setalias arg>
|
|
|
|
|
|
|
|
sets the alias of the certificate. This will allow the certificate
|
|
|
|
to be reffered to using a nickname for example "Steve's Certificate".
|
|
|
|
|
|
|
|
=item B<-alias>
|
|
|
|
|
|
|
|
outputs the certificate alias, if any.
|
|
|
|
|
|
|
|
=item B<-clrtrust>
|
|
|
|
|
|
|
|
clears all the permitted or trusted uses of the certificate.
|
|
|
|
|
|
|
|
=item B<-clrnotrust>
|
|
|
|
|
|
|
|
clears all the prohibited or untrusted uses of the certificate.
|
|
|
|
|
|
|
|
=item B<-addtrust arg>
|
|
|
|
|
|
|
|
adds a trusted certificate use. Currently acceptable values
|
|
|
|
are all (any purpose), sslclient (SSL client use), sslserver
|
|
|
|
(SSL server use) email (S/MIME email) and objsign (Object signing).
|
|
|
|
|
|
|
|
=item B<-addnotrust arg>
|
|
|
|
|
|
|
|
adds a prohibited use. It accepts the same values as the B<-addtrust>
|
|
|
|
option.
|
|
|
|
|
|
|
|
=item B<-purpose>
|
|
|
|
|
|
|
|
this option performs tests on the certificate extensions and outputs
|
|
|
|
the results. It checks to see if the certificate can be used as an
|
|
|
|
end user or CA certificate for various purposes. Since many commercial
|
|
|
|
certificates have invalid extensions it is possible that warnings will
|
|
|
|
be output for some certificates. Known problems have work arounds added.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
=head1 SIGNING OPTIONS
|
|
|
|
|
|
|
|
The B<x509> utility can be used to sign certificates and requests: it
|
|
|
|
can thus behave like a "mini CA".
|
|
|
|
|
|
|
|
=over 4
|
|
|
|
|
|
|
|
=item B<-signkey filename>
|
|
|
|
|
|
|
|
this option causes the input file to be self signed using the supplied
|
|
|
|
private key.
|
|
|
|
|
|
|
|
If the input file is a certificate it sets the issuer name to the
|
|
|
|
subject name (i.e. makes it self signed) changes the public key to the
|
|
|
|
supplied value and changes the start and end dates. The start date is
|
|
|
|
set to the current time and the end date is set to a value determined
|
|
|
|
by the B<-days> option. Any certificate extensions are retained unless
|
|
|
|
the B<-clrext> option is supplied.
|
|
|
|
|
|
|
|
If the input is a certificate request then a self signed certificate
|
|
|
|
is created using the supplied private key using the subject name in
|
|
|
|
the request.
|
|
|
|
|
|
|
|
=item B<-clrext>
|
|
|
|
|
|
|
|
delete any extensions from a certificate. This option is used when a
|
|
|
|
certificate is being created from another certificate (for example with
|
|
|
|
the B<-signkey> or the B<-CA> options). Normally all extensions are
|
|
|
|
retained.
|
|
|
|
|
|
|
|
=item B<-keyform PEM|DER>
|
|
|
|
|
|
|
|
specifies the format (DER or PEM) of the private key file used in the
|
|
|
|
B<-signkey> option.
|
|
|
|
|
|
|
|
=item B<-days arg>
|
|
|
|
|
|
|
|
specifies the number of days to make a certificate valid for. The default
|
|
|
|
is 30 days.
|
|
|
|
|
|
|
|
=item B<-x509toreq>
|
|
|
|
|
|
|
|
converts a certificate into a certificate request. The B<-signkey> option
|
|
|
|
is used to pass the required private key.
|
|
|
|
|
|
|
|
=item B<-req>
|
|
|
|
|
|
|
|
by default a certificate is expected on input. With this option a
|
|
|
|
certificate request is expected instead.
|
|
|
|
|
|
|
|
=item B<-CA filename>
|
|
|
|
|
|
|
|
specifies the CA certificate to be used for signing. When this option is
|
|
|
|
present B<x509> behaves like a "mini CA". The input file is signed by this
|
|
|
|
CA using this option: that is its issuer name is set to the subject name
|
|
|
|
of the CA and it is digitally signed using the CAs private key.
|
|
|
|
|
|
|
|
This option is normally combined with the B<-req> option. Without the
|
|
|
|
B<-req> option the input is a certificate which must be self signed.
|
|
|
|
|
|
|
|
=item B<-CAkey filename>
|
|
|
|
|
|
|
|
sets the CA private key to sign a certificate with. If this option is
|
|
|
|
not specified then it is assumed that the CA private key is present in
|
|
|
|
the CA certificate file.
|
|
|
|
|
|
|
|
=item B<-CAserial filename>
|
|
|
|
|
|
|
|
sets the CA serial number file to use.
|
|
|
|
|
|
|
|
When the B<-CA> option is used to sign a certificate it uses a serial
|
|
|
|
number specified in a file. This file consist of one line containing
|
|
|
|
an even number of hex digits with the serial number to use. After each
|
|
|
|
use the serial number is incremented and written out to the file again.
|
|
|
|
|
|
|
|
The default filename consists of the CA certificate file base name with
|
|
|
|
".srl" appended. For example if the CA certificate file is called
|
|
|
|
"mycacert.pem" it expects to find a serial number file called "mycacert.srl".
|
|
|
|
|
|
|
|
=item B<-CAcreateserial filename>
|
|
|
|
|
|
|
|
with this option the CA serial number file is created if it does not exist:
|
|
|
|
it will contain the serial number "01". Normally if the B<-CA> option is
|
|
|
|
specified and the serial number file does not exist it is an error.
|
|
|
|
|
|
|
|
=item B<-md2|-md5|-sha1|-mdc2>
|
|
|
|
|
|
|
|
the digest to sign with. It affects all commands that sign a certificate
|
|
|
|
or request.
|
|
|
|
|
|
|
|
=item B<-extfile filename>
|
|
|
|
|
|
|
|
file containing certificate extensions to use. If not specified then
|
|
|
|
no extensions are added to the certificate.
|
|
|
|
|
|
|
|
=item B<-extensions section>
|
|
|
|
|
|
|
|
the section to add certificate extensions from. If this option is not
|
|
|
|
specified then the extensions should either be contained in the unnamed
|
|
|
|
(default) section or the default section should contain a variable called
|
|
|
|
"extensions" which contains the section to use.
|
|
|
|
|
|
|
|
=back
|
|
|
|
|
|
|
|
=head1 EXAMPLES
|
|
|
|
|
|
|
|
Note: in these examples the '\' means the example should be all on one
|
|
|
|
line.
|
|
|
|
|
|
|
|
Display the contents of a certificate:
|
|
|
|
|
|
|
|
openssl x509 -in cert.pem -noout -text
|
|
|
|
|
|
|
|
Displa the certificate serial number:
|
|
|
|
|
|
|
|
openssl x509 -in cert.pem -noout -serial
|
|
|
|
|
|
|
|
|
|
|
|
Convert a certificate from PEM to DER format:
|
|
|
|
|
|
|
|
openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
|
|
|
|
|
|
|
|
Convert a certificate to a certificate request:
|
|
|
|
|
|
|
|
openssl x509 -x509toreq -in cert.pem -out req.pem -signkey key.pem
|
|
|
|
|
|
|
|
Convert a certificate request into a self signed certificate using
|
|
|
|
extensions for a CA:
|
|
|
|
|
|
|
|
openssl x509 -req -in careq.pem -config openssl.cnf -extensions v3_ca \
|
|
|
|
-signkey key.pem -out cacert.pem
|
|
|
|
|
|
|
|
Sign a certificate request using the CA certifcate above and add user
|
|
|
|
certificate extensions:
|
|
|
|
|
|
|
|
openssl x509 -req -in req.pem -config openssl.cnf -extensions v3_usr \
|
|
|
|
-CA cacert.pem -CAkey key.pem -CAcreateserial
|
|
|
|
|
|
|
|
|
|
|
|
Set a certificate to be trusted for SSL client use and change set its alias to
|
|
|
|
"Steve's Class 1 CA"
|
|
|
|
|
|
|
|
openssl x509 -in cert.pem -addtrust sslclient \
|
|
|
|
-alias "Steve's Class 1 CA" -out trust.pem
|
|
|
|
|
1999-11-13 21:58:39 +00:00
|
|
|
=head1 NOTES
|
|
|
|
|
|
|
|
The PEM format uses the header and footer lines:
|
|
|
|
|
|
|
|
-----BEGIN CERTIFICATE----
|
|
|
|
-----END CERTIFICATE----
|
|
|
|
|
|
|
|
it will also handle files containing:
|
|
|
|
|
|
|
|
-----BEGIN X509 CERTIFICATE----
|
|
|
|
-----END X509 CERTIFICATE----
|
|
|
|
|
1999-11-10 02:52:17 +00:00
|
|
|
=head1 BUGS
|
|
|
|
|
|
|
|
The way DNs are printed is in a "historical SSLeay" format which doesn't
|
|
|
|
follow any published standard. It should follow some standard like RFC2253
|
|
|
|
or RFC1779 with options to make the stuff more readable.
|
|
|
|
|
|
|
|
Extensions in certificates are not transferred to certificate requests and
|
|
|
|
vice versa.
|
|
|
|
|
|
|
|
It is possible to produce invalid certificates or requests by specifying the
|
|
|
|
wrong private key or using inconsistent options in some cases: these should
|
|
|
|
be checked.
|
|
|
|
|
|
|
|
There should be options to explicitly set such things are start and end
|
|
|
|
dates rather than an offset from the current time.
|
|
|
|
|
|
|
|
The code to implement the verify behaviour described in the B<TRUST SETTINGS>
|
|
|
|
is currently being developed. It thus describes the intended behavior rather
|
|
|
|
than the current behaviour. It is hoped that it will represent reality in
|
|
|
|
OpenSSL 0.9.5 and later.
|
|
|
|
|
|
|
|
|
|
|
|
=head1 SEE ALSO
|
|
|
|
|
|
|
|
req(1), ca(1), genrsa(1), gendsa(1)
|
|
|
|
|
|
|
|
=cut
|