Simple reusable django app implementing x509 PKI certificates management.
Table of Contents:
- Current features
- Project goals
- Dependencies
- Install stable version from pypi
- Install development version
- Setup (integrate in an existing django project)
- Installing for development
- Install and run on docker
- Settings
DJANGO_X509_DEFAULT_CERT_VALIDITY
DJANGO_X509_DEFAULT_CA_VALIDITY
DJANGO_X509_DEFAULT_KEY_LENGTH
DJANGO_X509_DEFAULT_DIGEST_ALGORITHM
DJANGO_X509_CA_BASIC_CONSTRAINTS_CRITICAL
DJANGO_X509_CA_BASIC_CONSTRAINTS_PATHLEN
DJANGO_X509_CA_KEYUSAGE_CRITICAL
DJANGO_X509_CA_KEYUSAGE_VALUE
DJANGO_X509_CERT_KEYUSAGE_CRITICAL
DJANGO_X509_CERT_KEYUSAGE_VALUE
DJANGO_X509_CRL_PROTECTED
- Extending django-x509
- Contributing
- Changelog
- License
- Support
- CA generation
- Import existing CAs
- End entity certificate generation
- Import existing certificates
- Certificate revocation
- CRL view (public or protected)
- Possibility to specify x509 extensions on each certificate
- Random serial numbers based on uuid4 integers (see why is this a good idea)
- provide a simple and reusable x509 PKI management django app
- provide abstract models that can be imported and extended in larger django projects
- Python 2.7 or Python >= 3.4
- OpenSSL
Install from pypi:
pip install django-x509
Install tarball:
pip install https://github.com/openwisp/django-x509/tarball/master
Alternatively you can install via pip using git:
pip install -e git+git://github.com/openwisp/django-x509#egg=django-x509
If you want to contribute, install your cloned fork:
git clone git@github.com:<your_fork>/django-x509.git
cd django-x509
python setup.py develop
Add django_x509
to INSTALLED_APPS
:
INSTALLED_APPS = [
# other apps
'django_x509',
]
Add the URLs to your main urls.py
:
urlpatterns = [
# ... other urls in your project ...
# django-x509 urls
# keep the namespace argument unchanged
url(r'^', include('django_x509.urls', namespace='x509')),
]
Then run:
./manage.py migrate
Install sqlite:
sudo apt-get install sqlite3 libsqlite3-dev
Install your forked repo:
git clone git://github.com/<your_fork>/django-x509
cd django-x509/
python setup.py develop
Install test requirements:
pip install -r requirements-test.txt
Create database:
cd tests/
./manage.py migrate
./manage.py createsuperuser
Launch development server:
./manage.py runserver
You can access the admin interface at http://127.0.0.1:8000/admin/.
Run tests with:
./runtests.py
Build from docker file:
sudo docker build -t openwisp/djangox509 .
Run the docker container:
sudo docker run -it -p 8000:8000 openwisp/djangox509
type: | int |
default: | 365 |
Default validity period (in days) when creating new x509 certificates.
type: | int |
default: | 3650 |
Default validity period (in days) when creating new Certification Authorities.
type: | int |
default: | 2048 |
Default key length for new CAs and new certificates.
Must be one of the following values:
512
1024
2048
4096
type: | str |
default: | sha256 |
Default digest algorithm for new CAs and new certificates.
Must be one of the following values:
sha1
sha224
sha256
sha384
sha512
type: | bool |
default: | True |
Whether the basicConstraint
x509 extension must be flagged as critical when creating new CAs.
type: | int or None |
default: | 0 |
Value of the pathLenConstraint
of basicConstraint
x509 extension used when creating new CAs.
When this value is a positive int
it represents the maximum number of non-self-issued
intermediate certificates that may follow the generated certificate in a valid certification path.
Set this value to None
to avoid imposing any limit.
type: | bool |
default: | True |
Whether the keyUsage
x509 extension should be flagged as "critical" for new CAs.
type: | str |
default: | cRLSign, keyCertSign |
Value of the keyUsage
x509 extension for new CAs.
type: | bool |
default: | False |
Whether the keyUsage
x509 extension should be flagged as "critical" for new
end-entity certificates.
type: | str |
default: | digitalSignature, keyEncipherment |
Value of the keyUsage
x509 extension for new end-entity certificates.
type: | bool |
default: | False |
Whether the view for downloading Certificate Revocation Lists should be protected with authentication or not.
django-x509 provides a set of models and admin classes which can be imported, extended and reused by third party apps.
To extend django-x509, you MUST NOT add it to settings.INSTALLED_APPS
,
but you must create your own app (which goes into settings.INSTALLED_APPS
), import the
base classes from django-x509 and add your customizations.
This example provides an example of how to extend the base models of django-x509 by adding a relation to another django model named Organization.
# models.py of your app
from django.db import models
from django_x509.base.models import AbstractCa, AbstractCert
# the model ``organizations.Organization`` is omitted for brevity
# if you are curious to see a real implementation, check out django-organizations
class OrganizationMixin(models.Model):
organization = models.ForeignKey('organizations.Organization')
class Meta:
abstract = True
class Ca(OrganizationMixin, AbstractCa):
class Meta(AbstractCa.Meta):
abstract = False
def clean(self):
# your own validation logic here...
pass
class Cert(OrganizationMixin, AbstractCert):
ca = models.ForeignKey(Ca)
class Meta(AbstractCert.Meta):
abstract = False
def clean(self):
# your own validation logic here...
pass
Following the previous Organization example, you can avoid duplicating the admin code by importing the base admin classes and registering your models with.
# admin.py of your app
from django.contrib import admin
from django_x509.base.admin import CaAdmin as BaseCaAdmin
from django_x509.base.admin import CertAdmin as BaseCertAdmin
from .models import Ca, Cert
class CaAdmin(BaseCaAdmin):
# extend/modify the default behaviour here
pass
class CertAdmin(BaseCertAdmin):
# extend/modify the default behaviour here
pass
admin.site.register(Ca, CaAdmin)
admin.site.register(Cert, CertAdmin)
- Announce your intentions in the OpenWISP Mailing List
- Fork this repo and install it
- Follow PEP8, Style Guide for Python Code
- Write code
- Write tests for your code
- Ensure all tests pass
- Ensure test coverage does not decrease
- Document your changes
- Send pull request
See CHANGES.
See LICENSE.