If your broker or cache uses a publicly trusted certificate (for example Amazon MQ’s default certificate or AWS ACM), no extra steps are needed. The steps below apply only when the certificate is issued by a private or internal CA.
Why this is required
Draftable’s services perform full TLS certificate validation on their outbound connections to RabbitMQ and Redis. They verify both:- The certificate chain — the issuing CA must be trusted by the container.
- The hostname — the certificate’s Subject Alternative Name (SAN) must match the hostname the service connects to.
TLS support for the compare service (RabbitMQ) and the converter (Redis) requires apish-compare and apish-converter version 3.0.3 or later. Ensure your images are current before configuring TLS.
Which services need the CA
Install your CA in every application container that connects to RabbitMQ or Redis over TLS:| Service | RabbitMQ (TLS) | Redis (TLS) |
|---|---|---|
| web | ✅ | ✅ |
| celery-worker | ✅ | ✅ |
| celery-beat | ✅ | ✅ |
| compare | ✅ | ✅ |
| converter | — | ✅ |
Step 1 — Trust your CA in the containers
Draftable’s containers run on Linux and use the operating system trust store. There are two supported approaches.Option A — Add the CA to the image (recommended)
Extend the relevant Draftable images to add your CA to the OS trust store. This is persistent and applies automatically wherever the image runs:Repeat for
draftable/apish-compare and draftable/apish-converter. Include the full chain (root plus any intermediate CAs).Option B — Mount the CA and point the runtime at it
If you prefer not to rebuild the images, mount your CA bundle into the pods and set the standard OpenSSL environment variables, which Draftable’s services honour on Linux:(or
SSL_CERT_DIR pointing at a directory that includes your CA). On Kubernetes this is commonly done with an init container that appends your CA to the system bundle in a shared volume.Step 2 — Enable TLS on the connections
Set the TLS environment variables on the services. See the Docker Compose guide for the full variable reference.Step 3 — Verify
From inside one of the application pods (or any pod in the same namespace that hasopenssl), confirm the certificate is trusted and the name matches:
- Verify return code: 0 (ok) — the certificate chain is trusted in that container.
unable to get local issuer certificatemeans the CA is not trusted there (revisit Step 1). - Subject Alternative Name — confirm it lists the exact hostname you connect to.
Troubleshooting
A service cannot connect, but openssl from the pod succeeds
A service cannot connect, but openssl from the pod succeeds
Confirm the CA is installed in that specific service’s container, not only in some of them. Each container has its own trust store, so the CA must be present in every service that connects over TLS (see the table above).
unable to get local issuer certificate
unable to get local issuer certificate
The CA chain is not trusted inside the container. Make sure you included the full chain (root plus intermediates) and that
update-ca-certificates ran (Option A), or that SSL_CERT_FILE / SSL_CERT_DIR points at a bundle that includes your CA (Option B).Certificate name mismatch
Certificate name mismatch
The hostname in
AMQP_HOST / REDIS_HOST is not in the certificate’s SAN. Reissue the certificate with a SAN that includes the exact hostname your services use to connect.