OdooWiki OCA HUB
Tools License: AGPL-3

This module was written to have your Odoo installation request SSL certificates from https://letsencrypt.org automatically.

auto_awesome What this module does

AI-generated from the code · Odoo 16.0

Automatically requests and renews free SSL certificates from Let's Encrypt for your Odoo website, so visitors get a secure HTTPS connection without manual certificate handling.

This module adds a "Let's Encrypt" section to Odoo's General Settings where you list the domain names the certificate should cover, set a command to reload your web server after a new certificate is saved, and optionally configure DNS-based validation.

  • A daily scheduled job checks the existing certificate and renews it when it is missing, expired, expiring within 30 days, or when you add new domain names.
  • You can choose to use the Let's Encrypt testing server, which has higher rate limits but issues certificates browsers do not trust.
  • For wildcard certificates (domains starting with *.) or when your Odoo instance is not publicly reachable, you can prefer DNS validation and provide a shell script that creates the required DNS TXT record; the script receives the domain and challenge value as environment variables.
  • The module validates your domain list: IP addresses and local domains such as localhost are rejected, and a wildcard is only allowed at the start of a domain.
  • It serves the HTTP challenge file through the public URL /.well-known/acme-challenge/ and can run a server reload command after saving the certificate.

It touches the settings screen (res.config.settings) and stores its options as configuration parameters. The certificate and account keys are kept in Odoo's data directory.

Depends on

base
Models and fields (2)
  • letsencrypt · new model
  • res.config.settings · extends an existing modelletsencrypt_altnames (Domain names), letsencrypt_prefer_dns (Prefer DNS validation), letsencrypt_dns_provider (DNS provider), letsencrypt_testing_mode (Use testing server), letsencrypt_reload_command (Server reload command), letsencrypt_dns_shell_script (DNS update script), letsencrypt_needs_dns_provider

Text generated by AI (DeepSeek) from reading the Odoo 16.0 code on GitHub; it may contain mistakes, so check the code before deciding. View the code on GitHub

Availability by version

Reviewed: 2026-11-03
Confirmed (verified in repository and branch) Estimated (unverified) No information

Confirmation status: 5 confirmed, 4 with no information of 9 versions.

Sources · Odoo 16.0

Confirmed on 2026-11-03 in branch 16.0 of OCA/server-tools.

terminal Installation and usage

OCA documentation · Odoo 16.0

After installation, this module generates a private key for your account at letsencrypt.org automatically in $data_dir/letsencrypt/account.key. If you want or need to use your own account key, replace the file.

For certificate requests to work, your site needs to be accessible via plain HTTP, see below for configuration examples in case you force your clients to the SSL version.

After installation, trigger the cronjob Update letsencrypt certificates and watch your log for messages.

This addons requests a certificate for the domain named in the configuration parameter web.base.url - if this comes back as localhost or the like, the module doesn't request anything.

Futher self-explanatory settings are in Settings -> General Settings. There you can add further domains to the CSR, add a custom script that updates your DNS and add a script that will be used to reload your web server (if needed). The number of domains that can be added to a certificate is capped at 100. A wildcard certificate can be used to avoid that limit.

Note that all those domains must be publicly reachable on port 80 via HTTP, and they must have an entry for .well-known/acme-challenge pointing to $datadir/letsencrypt/acme-challenge of your odoo instance.

Since DNS changes can take some time to propagate, when we respond to a DNS challenge and the server tries to check our response, it might fail (and probably will). The solution to this is documented in https://tools.ietf.org/html/rfc8555#section-8.2 and basically is a Retry-After header under which we can instruct the server to retry the challenge. At the time these lines were written, Boulder had not implemented this functionality. This prompted us to use letsencrypt.backoff configuration parameter, which is the amount of minutes this module will try poll the server to retry validating the answer to our challenge, specifically it is the deadline parameter of poll_and_finalize.

The module sets up a cronjob that requests and renews certificates automatically.

Certificates are renewed a month before they expire. Renewal is then attempted every day until it succeeds.

After the first run, you'll find a file called domain.crt in $datadir/letsencrypt, configure your SSL proxy to use this file as certificate.

In depth configuration

If you want to use multiple domains on your CSR then you have to configure them
from Settings -> General Settings. If you use a wildcard in any of those domains
then letsencrypt will return a DNS challenge. In order for that challenge to be
answered you will need to **either** provide a script (as seen in General Settings)
or install a module that provides support for your DNS provider. In that module
you will need to create a function in the letsencrypt model with the name
``_respond_challenge_dns_$DNS_PROVIDER`` where ``$DNS_PROVIDER`` is the name of your
provider and can be any string with length greater than zero, and add the name
of your DNS provider in the settings dns_provider selection field.

In any case if a script path is inserted in the settings page, it will be run
in case you want to update multiple DNS servers.

A reload command can be set in the Settings as well in case you need to reload
your web server. This by default is ``sudo /usr/sbin/service nginx reload``


You'll also need a matching sudo configuration, like::

    your_odoo_user ALL = NOPASSWD: /usr/sbin/service nginx reload

Further, if you force users to https, you'll need something like for nginx::

    if ($scheme = "http") {
        set $redirect_https 1;
    }
    if ($request_uri ~ ^/.well-known/acme-challenge/) {
        set $redirect_https 0;
    }
    if ($redirect_https) {
        rewrite ^   https://$server_name$request_uri? permanent;
    }

and this for apache::

    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteCond %{REQUEST_URI} "!^/.well-known/"
    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

In case you need to redirect other nginx sites to your Odoo instance, declare
an upstream for your odoo instance and do something like::

    location /.well-known {
        proxy_pass    http://yourodooupstream;
    }

If you're using a multi-database installation (with or without dbfilter option)
where /web/databse/selector returns a list of more than one database, then
you need to add ``letsencrypt`` addon to wide load addons list
(by default, only ``web`` addon), setting ``--load`` option.
For example, ``--load=web,letsencrypt``
info

Data imported from GitHub: this sheet reflects the latest catalog review, not a live lookup. Always check the module documentation and staging before installing in production.