letsencrypt/boulder is one of the server-side repositories TopGit tracks, currently at 5.7k stars, written primarily in Go. An ACME-based certificate authority, written in Go.
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
WHY NO REVIEW YET
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
This is an implementation of an ACME-based CA. The ACME
protocol allows the CA to automatically
verify that an applicant for a certificate actually controls an identifier, and
allows subscribers to issue and revoke certificates for the identifiers they
control. Boulder is the software that runs Let's
Encrypt.
Contents
Overview
Setting up Boulder
Development
Working with Certbot
Working with another ACME Client
Production
Contributing
License
Overview
Boulder is divided into the following main components:
Web Front Ends (one per API version)
Registration Authority
Validation Authority
Certificate Authority
Storage Authority
Publisher
CRL Updater
This component model lets us separate the function of the CA by security
context. The Web Front End, Validation Authority, CRL Storer, and
Publisher need access to the Internet, which puts them at greater risk of
compromise. The Registration Authority can live without Internet
connectivity, but still needs to talk to the Web Front End and Validation
Authority. The Certificate Authority need only receive instructions from the
Registration Authority. All components talk to the SA for storage, so most
lines indicating SA RPCs are not shown here.
CA ---------> Publisher
^
|
Subscriber -> WFE --> RA --> SA --> MariaDB
| ^
Subscriber server <- VA <----+ |
|
Browser -----> S3 <----- CRL Storer/Updater
Internally, the logic of the system is based around five types of objects:
accounts, authorizations, challenges, orders and certificates, mapping directly
to the resources of the same name in ACME. Requests from ACME clients result in
new objects and changes to objects. The Storage Authority maintains persistent
copies of the current set of objects.
Boulder uses gRPC for inter-component communication. For components that you
want to be remote, it is necessary to instantiate a "client" and "server" for
that component. The client implements the component's Go interface, while the
server has the actual logic for the component. A high level overview for this
communication model can be found in the gRPC
documentation.
The full details of how the various ACME operations happen in Boulder are
laid out in
DESIGN.md.
Setting up Boulder
Development
Boulder has a Dockerfile and uses Docker Compose to make it easy to install
and set up all its dependencies. This is how the maintainers work on Boulder,
and is our main recommended way to run it for development/experimentation. It
is not suitable for use as a production environment.
While we aim to make Boulder easy to setup ACME client developers may find
Pebble, a miniature version of
Boulder, to be better suited for continuous integration and quick
experimentation.
We recommend setting git's fsckObjects
setting
before getting a copy of Boulder to have better integrity guarantees for
updates.
Clone the boulder repository:
git clone https://github.com/letsencrypt/boulder/
cd boulder
Additionally, make sure you have Docker Engine 1.13.0+ and Docker Compose
1.10.0+ installed. If you do not, you can follow Docker's installation
instructions.
We recommend having at least 2GB of RAM available on your Docker host. In
practice using less RAM may result in the MariaDB container failing in
non-obvious ways.
To run our standard battery of tests (lints, unit, integration):
./t.sh
To run all unit tests:
./t.sh -u
To run specific unit tests (example is of the ./va directory):
./t.sh -u -p ./va
To run all integration tests:
./t.sh -i
To run unit tests and integration tests with coverage:
To run specific integration tests (example runs TestGenerateValidity and TestWFECORS):
./t.sh -i -f TestGenerateValidity/TestWFECORS
To do any of the above, but using the "config-next" configuration, which
represents a likely future state (e.g. including new feature flags):
./tn.sh -your -options -here
To start Boulder in a Docker container, first run:
docker compose run bsetup
this will write the necessary certificates into test/certs/[.softhsm-tokens,ipki,webpki];
You only need to run this once to create the certificates. If you
need to remove all of the certificates and start over, you can remove
the directories ./test/certs/.softhsm-tokens, ./test/certs/ipki,
and ./test/certs/webpki and re-run docker compose run bsetup.
Then run:
docker compose up
The configuration in docker-compose.yml mounts your boulder checkout at
/boulder so you can edit code on your host and it will be immediately
reflected inside the Docker containers run with docker compose.
If you have problems with Docker, you may want to try removing all
containers and
volumes.
By default, Boulder uses a fake DNS resolver that resolves all hostnames to
127.0.0.1. This is suitable for running integration tests inside the Docker
container. If you want Boulder to be able to communicate with a client
running on your host instead, you should find your host's Docker IP with:
And edit docker-compose.yml to change the FAKE_DNS environment variable to
match. This will cause Boulder's stubbed-out DNS resolver (sd-test-srv) to
respond to all A queries with the address in FAKE_DNS.
If you use a host-based firewall (e.g. ufw or iptables) make sure you allow
connections from the Docker instance to your host on the required validation
ports to your ACME client.
Alternatively, you can override the docker-compose.yml default with an
environmental variable using -e (replace 172.17.0.1 with the host IPv4
address found in the command above)
docker compose run --use-aliases -e FAKE_DNS=172.17.0.1 --service-ports boulder ./start.py
Running tests without the ./test.sh wrapper:
Run unit tests locally, without docker (only works for some directories):
go test ./issuance/...
Run all unit tests:
docker compose run --use-aliases boulder go test -p 1 ./...
Run unit tests for a specific directory:
docker compose run --use-aliases boulder go test <DIRECTORY>
Run integration tests (omit --filter <REGEX> to run all):
Check out the Certbot client from https://github.com/certbot/certbot and
follow their setup instructions. Once you've got the client set up, you'll
probably want to run it against your local Boulder. There are a number of
command line flags that are necessary to run the client against a local
Boulder, and without root access. The simplest way to run the client locally
is to use a convenient alias for certbot (certbot_test) with a custom
SERVER environment variable:
Your local Boulder instance uses a fake DNS resolver that returns 127.0.0.1
for any query, so you can use any value for the -d flag. To return an answer
other than 127.0.0.1 change the Boulder FAKE_DNS environment variable to
another IP address.
Working with another ACME Client
Once you have followed the Boulder development environment instructions and have
started the containers you will find the ACME endpoints exposed to your host at
the following URLs:
ACME v2, HTTP: http://localhost:4001/directory
ACME v2, HTTPS: https://localhost:4431/directory
To access the HTTPS versions of the endpoints you will need to configure your
ACME client software to use a CA truststore that contains the
test/certs/ipki/minica.pem CA certificate. See
test/certs/README.md
for more information.
Your local Boulder instance uses a fake DNS resolver that returns 127.0.0.1
for any query, allowing you to issue certificates for any domain as if it
resolved to your localhost. To return an answer other than 127.0.0.1 change
the Boulder FAKE_DNS environment variable to another IP address.
Most often you will want to configure FAKE_DNS to point to your host
machine where you run an ACME client.
Production
Boulder is custom built for Let's Encrypt and is intended only to support the
Web PKI and the CA/Browser forum's baseline requirements. In our experience
often Boulder is not the right fit for organizations that are evaluating it for
production usage. In most cases a centrally managed PKI that doesn't require
domain-authorization with ACME is a better choice. For this environment we
recommend evaluating a project other than Boulder.
We offer a brief deployment and implementation
guide
that describes some of the required work and security considerations involved in
using Boulder in a production environment. As-is the docker based Boulder
development environment is not suitable for
production usage. It uses private key material that is publicly available,
exposes debug ports and is brittle to component failure.
While we are supportive of other organization's deploying Boulder in
a production setting we prioritize support and development work that favors
Let's Encrypt's mission. This means we may not be able to provide timely support
or accept pull-requests that deviate significantly from our first line goals. If
you've thoroughly evaluated the alternatives and Boulder is definitely the best
fit we're happy to answer questions to the best of our ability.
Contributing
Please take a look at
CONTRIBUTING.md
for our guidelines on submitting patches, code review process, code of conduct,
and various other tips related to working on the codebase.
Code of Conduct
The code of conduct for everyone participating in this community in any capacity
is available for reference
on the community forum.
License
This project is licensed under the Mozilla Public License 2.0, the full text
of which can be found in the
LICENSE.txt
file.
The most recent commit recorded on letsencrypt/boulder was 14 days ago, based on the GitHub push timestamp. The repository has 645 forks — one of the better signals of community interest.
How many stars does letsencrypt/boulder have?
letsencrypt/boulder has 5.7k GitHub stars — refresh the page for the live number, or check github.com/letsencrypt/boulder. TopGit mirrors GitHub's count but does not claim minute-by-minute accuracy.
What else is in the Backend space?
letsencrypt/boulder is tracked by TopGit under the Backend category, alongside 9 GitHub-tagged topics. Trending and Topics pages list peer repositories of comparable stars and language.
What language is letsencrypt/boulder written in?
letsencrypt/boulder is written primarily in Go. GitHub's language field is based on the largest share of bytes in the default branch.
What topics is letsencrypt/boulder associated with?
GitHub's repository topics for letsencrypt/boulder: "acme", "boulder", "ca", "certificate-authority", "go", "lets-encrypt", "pki", "rfc8555", "tls". TopGit's editorial category is Backend.
Where do I read more about letsencrypt/boulder?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/letsencrypt/boulder is the definitive source.
Why is letsencrypt/boulder categorized under Backend?
TopGit places letsencrypt/boulder in the Backend category based on its GitHub topics and description (tagged: "acme", "boulder", "ca"). Categories are assigned from real repository metadata, not editorial guesswork.
Read full README in the tab above.
Want a second opinion on boulder?
Ask an AI that can read this page — one click and you get its take on boulder.