lacme is a small ACME client written with process isolation and minimal
privileges in mind.  It is divided into four components, each with its
own executable:

  * A process to manage the account key and issue SHA-256 signatures
    needed for each ACME command.  (This process binds to a UNIX-domain
    socket to reply to signature requests from the ACME client.)  One
    can use the UNIX-domain socket forwarding facility of OpenSSH 6.7
    and later to run this process on a different host.

  * A "master" process, which runs as root and is the only component
    with access to the private key material of the server keys.  It is
    used to fork the ACME client (and optionally the ACME webserver)
    after dropping root privileges.  For certificate issuances,
    it also generates Certificate Signing Requests, then verifies the
    validity of the issued certificate, and optionally reloads or
    restarts services when the notify option is set.

  * An actual ACME client, which builds ACME commands and dialogues with
    the remote ACME server.  Since ACME commands need to be signed with
    the account key, the "master" process passes the UNIX-domain socket
    of the account key manager to the ACME client: data signatures are
    requested by writing the data to be signed to the socket.

  * For certificate issuances, an optional webserver which is spawned by
    the "master".  (The only challenge type currently supported is
    "http-01", which requires a webserver to answer challenges.)  That
    webserver only processes GET and HEAD requests under the
    "/.well-known/acme-challenge/" URI.  Moreover temporary iptables(8)
    rules can be automatically installed to open the HTTP port.

Consult the manuals for more information.



Requesting new Certificate Issuance with the ACME protocol generally
works as follows:

  1. Generate a Certificate Signing Request.  This requires access to
     the private part of the server key.
  2. Issue an issuance request against the ACME server.
  3. Answer the ACME Identifier Validation Challenges.  The challenge
     type "http-01" requires a webserver to listen on port 80 for each
     address for which an authorization request is issued; if there is
     no running webserver, root privileges are required to bind against
     port 80 and to install firewall rules to temporarily open the port.
  4. Install the certificate (after verification) and restart the
     service.  This usually requires root access as well.

Steps 1,3,4 need to be run on the host for which an authorization
request is issued.  However the the issuance itself (step 2) could be
done from another machine.  Furthermore, each ACME command (step 2), as
well as the key authorization token in step 3, need to be signed using
an account key.  The account key can be stored on another machine, or
even on a smartcard.


lacme is Copyright © 2015-2021 Guilhem Moulin ⟨guilhem@fripost.org⟩, and
licensed for use under the GNU General Public License version 3 or
later.  See ‘COPYING’ for specific terms and distribution information.