mirror of
https://github.com/certbot/certbot.git
synced 2026-06-21 14:39:19 -04:00
384 lines
17 KiB
ReStructuredText
384 lines
17 KiB
ReStructuredText
|
||
rking with Certificates
|
||
=========================
|
||
|
||
.. contents:: Table of Contents
|
||
:local:
|
||
|
||
Before You Begin
|
||
================
|
||
|
||
The ``certbot`` script on your web server might be named ``letsencrypt`` if your system uses an older package, or ``certbot-auto`` if you used an alternate installation method. Throughout the docs, whenever you see ``certbot``, swap in the correct name as needed.
|
||
|
||
|
||
* Figure out which plugin to use
|
||
* Use the plugin to get the certificate
|
||
|
||
|
||
|
||
.. _managing-certs:
|
||
|
||
Managing certificates
|
||
=====================
|
||
|
||
To view a list of the certificates Certbot knows about, run
|
||
the ``certificates`` subcommand:
|
||
|
||
``certbot certificates``
|
||
|
||
This returns information in the following format::
|
||
|
||
Found the following certs:
|
||
Certificate Name: example.com
|
||
Domains: example.com, www.example.com
|
||
Expiry Date: 2017-02-19 19:53:00+00:00 (VALID: 30 days)
|
||
Certificate Path: /etc/letsencrypt/live/example.com/fullchain.pem
|
||
Private Key Path: /etc/letsencrypt/live/example.com/privkey.pem
|
||
|
||
``Certificate Name`` shows the name of the certificate. Pass this name
|
||
using the ``--cert-name`` flag to specify a particular certificate for the ``run``,
|
||
``certonly``, ``certificates``, ``renew``, and ``delete`` commands. Example::
|
||
|
||
certbot certonly --cert-name example.com
|
||
|
||
.. _updating_certs:
|
||
|
||
Re-creating and Updating Existing Certificates
|
||
----------------------------------------------
|
||
|
||
You can use ``certonly`` or ``run`` subcommands to request
|
||
the creation of a single new certificate even if you already have an
|
||
existing certificate with some of the same domain names.
|
||
|
||
If a certificate is requested with ``run`` or ``certonly`` specifying a
|
||
certificate name that already exists, Certbot updates
|
||
the existing certificate. Otherwise a new certificate
|
||
is created and assigned the specified name.
|
||
|
||
The ``--force-renewal``, ``--duplicate``, and ``--expand`` options
|
||
control Certbot's behavior when re-creating
|
||
a certificate with the same name as an existing certificate.
|
||
If you don't specify a requested behavior, Certbot may ask you what you intended.
|
||
|
||
|
||
``--force-renewal`` tells Certbot to request a new certificate
|
||
with the same domains as an existing certificate. Each domain
|
||
must be explicitly specified via ``-d``. If successful, this certificate
|
||
is saved alongside the earlier one and symbolic links (the "``live``"
|
||
reference) will be updated to point to the new certificate. This is a
|
||
valid method of renewing a specific individual
|
||
certificate.
|
||
|
||
``--duplicate`` tells Certbot to create a separate, unrelated certificate
|
||
with the same domains as an existing certificate. This certificate is
|
||
saved completely separately from the prior one. Most users will not
|
||
need to issue this command in normal circumstances.
|
||
|
||
``--expand`` tells Certbot to update an existing certificate with a new
|
||
certificate that contains all of the old domains and one or more additional
|
||
new domains. With the ``--expand`` option, use the ``-d`` option to specify
|
||
all existing domains and one or more new domains.
|
||
|
||
Example:
|
||
|
||
.. code-block:: none
|
||
|
||
certbot --expand -d existing.com,example.com,newdomain.com
|
||
|
||
If you prefer, you can specify the domains individually like this:
|
||
|
||
.. code-block:: none
|
||
|
||
certbot --expand -d existing.com -d example.com -d newdomain.com
|
||
|
||
Consider using ``--cert-name`` instead of ``--expand``, as it gives more control
|
||
over which certificate is modified and it lets you remove domains as well as adding them.
|
||
|
||
|
||
``--allow-subset-of-names`` tells Certbot to continue with certificate generation if
|
||
only some of the specified domain authorizations can be obtained. This may
|
||
be useful if some domains specified in a certificate no longer point at this
|
||
system.
|
||
|
||
Whenever you obtain a new certificate in any of these ways, the new
|
||
certificate exists alongside any previously obtained certificates, whether
|
||
or not the previous certificates have expired. The generation of a new
|
||
certificate counts against several rate limits that are intended to prevent
|
||
abuse of the ACME protocol, as described
|
||
`here <https://community.letsencrypt.org/t/rate-limits-for-lets-encrypt/6769>`__.
|
||
|
||
.. _changing:
|
||
|
||
Changing a Certificate's Domains
|
||
--------------------------------
|
||
|
||
The ``--cert-name`` flag can also be used to modify the domains a certificate contains,
|
||
by specifying new domains using the ``-d`` or ``--domains`` flag. If certificate ``example.com``
|
||
previously contained ``example.com`` and ``www.example.com``, it can be modified to only
|
||
contain ``example.com`` by specifying only ``example.com`` with the ``-d`` or ``--domains`` flag. Example::
|
||
|
||
certbot certonly --cert-name example.com -d example.com
|
||
|
||
The same format can be used to expand the set of domains a certificate contains, or to
|
||
replace that set entirely::
|
||
|
||
certbot certonly --cert-name example.com -d example.org,www.example.org
|
||
|
||
|
||
Revoking certificates
|
||
---------------------
|
||
|
||
If your account key has been compromised or you otherwise need to revoke a certificate,
|
||
use the ``revoke`` command to do so. Note that the ``revoke`` command takes the certificate path
|
||
(ending in ``cert.pem``), not a certificate name or domain. Example::
|
||
|
||
certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem
|
||
|
||
You can also specify the reason for revoking your certificate by using the ``reason`` flag.
|
||
Reasons include ``unspecified`` which is the default, as well as ``keycompromise``,
|
||
``affiliationchanged``, ``superseded``, and ``cessationofoperation``::
|
||
|
||
certbot revoke --cert-path /etc/letsencrypt/live/CERTNAME/cert.pem --reason keycompromise
|
||
|
||
Additionally, if a certificate
|
||
is a test certificate obtained via the ``--staging`` or ``--test-cert`` flag, that flag must be passed to the
|
||
``revoke`` subcommand.
|
||
Once a certificate is revoked (or for other certificate management tasks), all of a certificate's
|
||
relevant files can be removed from the system with the ``delete`` subcommand::
|
||
|
||
certbot delete --cert-name example.com
|
||
|
||
.. note:: If you don't use ``delete`` to remove the certificate completely, it will be renewed automatically at the next renewal event.
|
||
|
||
.. note:: Revoking a certificate will have no effect on the rate limit imposed by the Let's Encrypt server.
|
||
|
||
.. _renewal:
|
||
|
||
Renewing certificates
|
||
---------------------
|
||
|
||
.. note:: Let's Encrypt CA issues short-lived certificates (90
|
||
days). Make sure you renew the certificates at least once in 3
|
||
months.
|
||
|
||
As of version 0.10.0, Certbot supports a ``renew`` action to check
|
||
all installed certificates for impending expiry and attempt to renew
|
||
them. The simplest form is simply
|
||
|
||
``certbot renew``
|
||
|
||
This command attempts to renew any previously-obtained certificates that
|
||
expire in less than 30 days. The same plugin and options that were used
|
||
at the time the certificate was originally issued will be used for the
|
||
renewal attempt, unless you specify other plugins or options. Unlike ``certonly``, ``renew`` acts on
|
||
multiple certificates and always takes into account whether each one is near
|
||
expiry. Because of this, ``renew`` is suitable (and designed) for automated use,
|
||
to allow your system to automatically renew each certificate when appropriate.
|
||
Since ``renew`` only renews certificates that are near expiry it can be
|
||
run as frequently as you want - since it will usually take no action.
|
||
|
||
The ``renew`` command includes hooks for running commands or scripts before or after a certificate is
|
||
renewed. For example, if you have a single certificate obtained using
|
||
the standalone_ plugin, you might need to stop the webserver
|
||
before renewing so standalone can bind to the necessary ports, and
|
||
then restart it after the plugin is finished. Example::
|
||
|
||
certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
|
||
|
||
If a hook exits with a non-zero exit code, the error will be printed
|
||
to ``stderr`` but renewal will be attempted anyway. A failing hook
|
||
doesn't directly cause Certbot to exit with a non-zero exit code, but
|
||
since Certbot exits with a non-zero exit code when renewals fail, a
|
||
failed hook causing renewal failures will indirectly result in a
|
||
non-zero exit code. Hooks will only be run if a certificate is due for
|
||
renewal, so you can run the above command frequently without
|
||
unnecessarily stopping your webserver.
|
||
|
||
``--pre-hook`` and ``--post-hook`` hooks run before and after every renewal
|
||
attempt. If you want your hook to run only after a successful renewal, use
|
||
``--deploy-hook`` in a command like this.
|
||
|
||
``certbot renew --deploy-hook /path/to/deploy-hook-script``
|
||
|
||
For example, if you have a daemon that does not read its certificates as the
|
||
root user, a deploy hook like this can copy them to the correct location and
|
||
apply appropriate file permissions.
|
||
|
||
/path/to/deploy-hook-script
|
||
|
||
.. code-block:: none
|
||
|
||
#!/bin/sh
|
||
|
||
set -e
|
||
|
||
for domain in $RENEWED_DOMAINS; do
|
||
case $domain in
|
||
example.com)
|
||
daemon_cert_root=/etc/some-daemon/certs
|
||
|
||
# Make sure the certificate and private key files are
|
||
# never world readable, even just for an instant while
|
||
# we're copying them into daemon_cert_root.
|
||
umask 077
|
||
|
||
cp "$RENEWED_LINEAGE/fullchain.pem" "$daemon_cert_root/$domain.cert"
|
||
cp "$RENEWED_LINEAGE/privkey.pem" "$daemon_cert_root/$domain.key"
|
||
|
||
# Apply the proper file ownership and permissions for
|
||
# the daemon to read its certificate and key.
|
||
chown some-daemon "$daemon_cert_root/$domain.cert" \
|
||
"$daemon_cert_root/$domain.key"
|
||
chmod 400 "$daemon_cert_root/$domain.cert" \
|
||
"$daemon_cert_root/$domain.key"
|
||
|
||
service some-daemon restart >/dev/null
|
||
;;
|
||
esac
|
||
done
|
||
|
||
You can also specify hooks by placing files in subdirectories of Certbot's
|
||
configuration directory. Assuming your configuration directory is
|
||
``/etc/letsencrypt``, any executable files found in
|
||
``/etc/letsencrypt/renewal-hooks/pre``,
|
||
``/etc/letsencrypt/renewal-hooks/deploy``, and
|
||
``/etc/letsencrypt/renewal-hooks/post`` will be run as pre, deploy, and post
|
||
hooks respectively when any certificate is renewed with the ``renew``
|
||
subcommand. These hooks are run in alphabetical order and are not run for other
|
||
subcommands. (The order the hooks are run is determined by the byte value of
|
||
the characters in their filenames and is not dependent on your locale.)
|
||
|
||
Hooks specified in the command line, :ref:`configuration file
|
||
<config-file>`, or :ref:`renewal configuration files <renewal-config-file>` are
|
||
run as usual after running all hooks in these directories. One minor exception
|
||
to this is if a hook specified elsewhere is simply the path to an executable
|
||
file in the hook directory of the same type (e.g. your pre-hook is the path to
|
||
an executable in ``/etc/letsencrypt/renewal-hooks/pre``), the file is not run a
|
||
second time. You can stop Certbot from automatically running executables found
|
||
in these directories by including ``--no-directory-hooks`` on the command line.
|
||
|
||
More information about hooks can be found by running
|
||
``certbot --help renew``.
|
||
|
||
If you're sure that this command executes successfully without human
|
||
intervention, you can add the command to ``crontab`` (since certificates
|
||
are only renewed when they're determined to be near expiry, the command
|
||
can run on a regular basis, like every week or every day). In that case,
|
||
you are likely to want to use the ``-q`` or ``--quiet`` quiet flag to
|
||
silence all output except errors.
|
||
|
||
If you are manually renewing all of your certificates, the
|
||
``--force-renewal`` flag may be helpful; it causes the expiration time of
|
||
the certificate(s) to be ignored when considering renewal, and attempts to
|
||
renew each and every installed certificate regardless of its age. (This
|
||
form is not appropriate to run daily because each certificate will be
|
||
renewed every day, which will quickly run into the certificate authority
|
||
rate limit.)
|
||
|
||
Note that options provided to ``certbot renew`` will apply to
|
||
*every* certificate for which renewal is attempted; for example,
|
||
``certbot renew --rsa-key-size 4096`` would try to replace every
|
||
near-expiry certificate with an equivalent certificate using a 4096-bit
|
||
RSA public key. If a certificate is successfully renewed using
|
||
specified options, those options will be saved and used for future
|
||
renewals of that certificate.
|
||
|
||
An alternative form that provides for more fine-grained control over the
|
||
renewal process (while renewing specified certificates one at a time),
|
||
is ``certbot certonly`` with the complete set of subject domains of
|
||
a specific certificate specified via `-d` flags. You may also want to
|
||
include the ``-n`` or ``--noninteractive`` flag to prevent blocking on
|
||
user input (which is useful when running the command from cron).
|
||
|
||
``certbot certonly -n -d example.com -d www.example.com``
|
||
|
||
All of the domains covered by the certificate must be specified in
|
||
this case in order to renew and replace the old certificate rather
|
||
than obtaining a new one; don't forget any `www.` domains! Specifying
|
||
a subset of the domains creates a new, separate certificate containing
|
||
only those domains, rather than replacing the original certificate.
|
||
When run with a set of domains corresponding to an existing certificate,
|
||
the ``certonly`` command attempts to renew that specific certificate.
|
||
|
||
Please note that the CA will send notification emails to the address
|
||
you provide if you do not renew certificates that are about to expire.
|
||
|
||
Certbot is working hard to improve the renewal process, and we
|
||
apologize for any inconvenience you encounter in integrating these
|
||
commands into your individual environment.
|
||
|
||
.. note:: ``certbot renew`` exit status will only be 1 if a renewal attempt failed.
|
||
This means ``certbot renew`` exit status will be 0 if no cert needs to be updated.
|
||
If you write a custom script and expect to run a command only after a cert was actually renewed
|
||
you will need to use the ``--post-hook`` since the exit status will be 0 both on successful renewal
|
||
and when renewal is not necessary.
|
||
|
||
|
||
|
||
.. _where-certs:
|
||
|
||
|
||
Where are my certificates?
|
||
==========================
|
||
|
||
All generated keys and issued certificates can be found in
|
||
``/etc/letsencrypt/live/$domain``. Rather than copying, please point
|
||
your (web) server configuration directly to those files (or create
|
||
symlinks). During the renewal_, ``/etc/letsencrypt/live`` is updated
|
||
with the latest necessary files.
|
||
|
||
.. note:: ``/etc/letsencrypt/archive`` and ``/etc/letsencrypt/keys``
|
||
contain all previous keys and certificates, while
|
||
``/etc/letsencrypt/live`` symlinks to the latest versions.
|
||
|
||
The following files are available:
|
||
|
||
``privkey.pem``
|
||
Private key for the certificate.
|
||
|
||
.. warning:: This **must be kept secret at all times**! Never share
|
||
it with anyone, including Certbot developers. You cannot
|
||
put it into a safe, however - your server still needs to access
|
||
this file in order for SSL/TLS to work.
|
||
|
||
This is what Apache needs for `SSLCertificateKeyFile
|
||
<https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatekeyfile>`_,
|
||
and Nginx for `ssl_certificate_key
|
||
<http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate_key>`_.
|
||
|
||
``fullchain.pem``
|
||
All certificates, **including** server certificate (aka leaf certificate or
|
||
end-entity certificate). The server certificate is the first one in this file,
|
||
followed by any intermediates.
|
||
|
||
This is what Apache >= 2.4.8 needs for `SSLCertificateFile
|
||
<https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatefile>`_,
|
||
and what Nginx needs for `ssl_certificate
|
||
<http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_certificate>`_.
|
||
|
||
``cert.pem`` and ``chain.pem`` (less common)
|
||
``cert.pem`` contains the server certificate by itself, and
|
||
``chain.pem`` contains the additional intermediate certificate or
|
||
certificates that web browsers will need in order to validate the
|
||
server certificate. If you provide one of these files to your web
|
||
server, you **must** provide both of them, or some browsers will show
|
||
"This Connection is Untrusted" errors for your site, `some of the time
|
||
<https://whatsmychaincert.com/>`_.
|
||
|
||
Apache < 2.4.8 needs these for `SSLCertificateFile
|
||
<https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatefile>`_.
|
||
and `SSLCertificateChainFile
|
||
<https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatechainfile>`_,
|
||
respectively.
|
||
|
||
If you're using OCSP stapling with Nginx >= 1.3.7, ``chain.pem`` should be
|
||
provided as the `ssl_trusted_certificate
|
||
<http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_trusted_certificate>`_
|
||
to validate OCSP responses.
|
||
|
||
.. note:: All files are PEM-encoded.
|
||
If you need other format, such as DER or PFX, then you
|
||
could convert using ``openssl``. You can automate that with
|
||
``--deploy-hook`` if you're using automatic renewal_.
|
||
|
||
|