Releases: mathiasertl/django-ca
3.0.0 (2026-04-05)
Please see the official ChangeLog for release notes.
2.5.0 (2025-12-31)
Please see the official ChangeLog for release notes.
2.4.0 (2025-09-28)
Please see the official ChangeLog for release notes.
2.3.0 (2025-07-13)
Please see the official ChangeLog for release notes.
2.2.1 (2025-03-02)
- Python API: When signing certificates via a profile, the caller may pass unrecognized
extensions via theallow_unrecognized_extensionsflag.
2.2.0 (2025-02-15)
NOTE: This release is ahead of schedule due to customer requirements in downstream plugins.
- Key backends now support signing arbitrary data. This functionality is not used by django-ca itself, but may be used by plugins.
- Optimize number of database queries in performance-sensitive views (OCSP, CRLs, ACMEv2).
- Fix error for OCSP queries for intermediate CAs.
- Add support for storing/importing Ed25519 and Ed448 keys into HSMs.
Command-line utilities
- Drop support for old OpenSSL-style subject formats in
manage.py init_ca,manage.py sign_certandmanage.py resign_cert(default switched in 2.0.0, deprecated since 1.27.0). Use RFC 4514 subjects instead.
Settings
- Dropped support for the old subject format in CA_DEFAULT_SUBJECT and subjects in profiles (deprecated since 1.29.0).
- Project-level configuration now allows you to append to the projects URL configuration via EXTEND_URL_PATTERNS and EXTEND_INSTALLED_APPS. The latter replaces
CA_CUSTOM_APPS, which is deprecated and will be removed indjango-ca==2.5.0.
Dependencies
- Add support for
acme~=3.1.0andacme~=3.2.0. - BACKWARDS INCOMPATIBLE: Dropped support for
django~=5.0.0,cryptography~=43.0,acme~=2.11.0andpydantic~=2.9.0. - BACKWARDS INCOMPATIBLE: Dropped support for Alpine 3.18.
Python API
django_ca.utils.get_storage()was removed (deprecated since 2.0).- Key backends now expose sign_data() to sign arbitrary data.
Deprecation notices
CA_CUSTOM_APPS, a project-level configuration variable, is deprecated and will be removed indjango-ca==2.5.0.- This will be the last release to support Debian 11 (Bullseye) and Alpine 3.19.
- This will be the last release to support
josepy~=1.15.0,acme~=3.0.0andacme~=3.1.0. django_ca.extensions.parse_extension()is deprecated and will be removed indjango-ca==2.3.0. Use Pydantic models instead.- Functions related to the old OpenSSL style subject format are deprecated and will be removed in
django_ca==2.3.0:django_ca.utils.parse_name_x509()django_ca.utils.parse_serialized_name_attributes()django_ca.utils.serialize_name()django_ca.utils.split_str()django_ca.utils.x509_name()
2.1.1 (2025-01-05)
- Security: No longer allow clients to update other accounts.
- Fix celery startup script so that the directory containing the secret key is created correctly.
2.1.0 (2024-12-26)
Docker image
- The main Docker image is now based off Debian instead of Alpine. The Alpine image is still provided with the
-alpinesuffix (e.g.mathiasertl/django-ca:2.1.0-alpine). - Include the
hsmandmysqlextras in the image. - The Alpine image is now based on Alpine 3.21.
Certificate Revocation Lists
- Certificate Revocation Lists (CRLs) are now stored in the database via the CertificateRevocationList model. This makes CRLs more robust, as clearing the cache will no longer cause an error.
OCSP responder keys
- Private keys for OCSP responders are now stored using configurable backends, just like private keys for certificate authorities. See OCSP key backends for more information.
- Add a HSM OCSP key backend to allow storing OCSP keys in a HSM (Hardware Security Module).
- Add a Database OCSP key backend to allow storing OCSP keys in the database.
Key backends
- Add a Database backend to allow storing private keys in the database. This backend makes the private key accessible to any frontend-facing web server and is thus less secure then other backends, but is an option if your environment has no file system available.
- Remove the
get_ocsp_key_size()andget_ocsp_key_elliptic_curve()from the core key backend interface, as they are now handled by OCSP key backends
Command-line utilities
- Add the
-only-some-reasonsparameter tomanage.py dump_crl. - The
--scopeparameter tomanage.py dump_crlis deprecated and will be removed in django-ca 2.3.0. Use--only-contains-ca-certs,--only-contains-user-certsor--only-contains-attribute-certsinstead. - BACKWARDS INCOMPATIBLE: The
--algorithmparameter tomanage.py dump_crlno longer has any effect and will be removed in django-ca 2.3.0.
REST API
- When requesting a new certificate, validate the submitted CSR before relaying the order to the backend (fixes #15).
- Support for the Admissions extension when
cryptography>=44is used.
Settings
- The
encodingsparameter to CA_CRL_PROFILES was removed. Both encodings are now always available. - The
scopeparameter to CA_CRL_PROFILES is now deprecated in favor of theonly_contains_ca_certs,only_contains_user_certsandonly_some_reasonsparameters. The old parameter currently still takes precedence, but will be removed in django-ca 2.3.0.
Dependencies
- Add support for Python 3.13,
cryptography~=44.0,pydantic~=2.10.0andacme~=3.0.0. - BACKWARDS INCOMPATIBLE: Dropped support for
pydantic~=2.7.0,pydantic~=2.8.0,cryptography~=42.0andacme~=2.10.0.
Python API
-
Functions that create a certificate now take a
not_afterparameter, replacingexpires. Theexpiresparameter is deprecated and will be removed in django-ca 2.3.0. The following functions are affected: -
get_crl_cache_key() added the
only_contains_ca_certs,only_contains_user_certs,only_contains_attribute_certsandonly_some_reasonsarguments. -
BACKWARDS INCOMPATIBLE: The
scopeargument for get_crl_cache_key() was removed. Use the parameters described above instead.
Database models
- Rename the
valid_fromtonot_beforeandexpirestonot_afterto align with the terminology used in RFC 5280. The previous read-only property was removed. - Add the CertificateRevocationList model to store generated CRLs.
- django_ca.models.CertificateAuthority.get_crl_certs() and django_ca.models.CertificateAuthority.get_crl() are deprecated and will be removed in django-ca 2.3.0.
- BACKWARDS INCOMPATIBLE: The
algorithm,counter,full_name,relative_nameandinclude_issuing_distribution_pointparameters for django_ca.models.CertificateAuthority.get_crl() no longer have any effect.
Views
-
The CertificateRevocationListView has numerous updates:
- BACKWARDS INCOMPATIBLE: The
passwordparameter was removed. Use the CA_PASSWORDS setting instead (deprecated since django-ca 1.29.0). - The
expiresparameter now has a default of86400(from600) to align with defaults elsewhere. - The
scopeparameter is deprecated and will be removed in django-ca 2.3.0. Useonly_contains_ca_certsandonly_contains_user_certsinstead. - The
include_issuing_distribution_pointno longer has any effect and will be removed in django-ca 2.3.0.
- BACKWARDS INCOMPATIBLE: The
Deprecation notices
Please also see the deprecation timeline for previous deprecation notices.
- This will be the last release to support
django~=5.0.0,cryptography~=43.0,pydantic~=2.9.0andacme~=2.9.0. - This will be the last release to support Ubuntu 20.04 and Alpine 3.18.
- Support for Python 3.9 and
django~=4.2.0will be dropped indjango-ca==2.3.0.
2.0.0 (2024-09-29)
General
- Add (preliminary) support for storing private keys in a hardware security module (HSM). See Key backends for more information.
Command-line utilities
- Subjects are now parsed in the RFC 4514 format by default. Subjects in the OpenSSL-style format are still supported via the
--subject-format=openssloption, but support for it will be removed in 2.0.0. - Removed the
convert_timestampscommand (deprecated since 1.28.0).
Dependencies
- Add support for
Django~=5.1.0,cryptography~=43.0andpydantic~=2.8.0andpydantic~=2.9.0. - BACKWARDS INCOMPATIBLE: Dropped support for
pydantic<2.7.0,acme~=2.9.0andCelery~=5.3.0. - Remove the
psycopg3pip extra, use thepostgresextra instead. - Drop support for Alpine 3.17.
Python API
-
django_ca.utils.parse_encoding no longer accepts an already parsed Encoding.
-
django_ca.utils.parse_expires()anddjango_ca.utils.parse_key_curvewhere removed. -
CertificateAuthorityManager.objects.init() no longer accepts
intortimedeltafor expires. Pass a timezone-aware object instead. -
django_ca.profiles.Profile no longer accepts unparsed extension values:
- An
intforexpires- pass atimedeltainstead. - A
stror iterable ofstr-tuples forsubject- pass a cryptography.x509.Name instead. - Deprecated extensions formats in
extensions.
Note that this does not affect configuration in settings, as these values are parsed before passed to this
class. - An
-
django_ca.profiles.Profile.create_cert no longer accepts
intfor expires. Pass atimedeltainstead.
Docker/Docker Compose
- Update NGINX to 1.26.0.
Deprecation notices
- This will be the last release to support
pydantic~=2.7.0,pydantic~=2.8.0,cryptography~=42.0
andacme~=2.10.0. django_ca.utils.get_storage()will be removed in 2.2.0.