跳转到主要内容

可重复使用的django应用程序,用于生成和管理x509证书

项目描述

CI build status Test Coverage Dependency monitoring chat Pypi Version downloads code style: black
demo

实现x509 PKI证书管理的简单可重复使用的django应用程序。

想帮助OpenWISP? 了解如何帮助我们成长.

https://raw.githubusercontent.com/openwisp/openwisp2-docs/master/assets/design/openwisp-logo-black.svg

当前功能

  • CA 生成

  • 导入现有的 CA

  • 终端实体证书生成

  • 导入现有的证书

  • 证书吊销

  • CRL 查看器(公开或受保护)

  • 可以为每个证书指定 x509 扩展

  • 基于 uuid4 整数的随机序列号(见 为什么这是一个好主意

  • 可以生成和导入密码保护的 x509 证书/CA

  • 密码保护的 x509 内容将在 Web UI 中加密显示

项目目标

  • 提供一个简单且可重用的 x509 PKI 管理django应用

  • 提供可以在大型 django 项目中导入和扩展的抽象模型

依赖项

  • Python >= 3.8

  • OpenSSL

从PyPI安装稳定版本

从 pypi 安装

pip install django-x509

安装开发版本

安装 tarball

pip install https://github.com/openwisp/django-x509/tarball/master

或者您可以使用 pip 通过 git 安装

pip install -e git+git://github.com/openwisp/django-x509#egg=django-x509

如果您想贡献,请安装您克隆的分支

git clone git@github.com:<your_fork>/django-x509.git
cd django-x509
python setup.py develop

设置(集成到现有django项目中)

django_x509 添加到 INSTALLED_APPS

INSTALLED_APPS = [
    # other apps
    "django_x509",
]

将 URL 添加到主 urls.py

from django.contrib import admin

urlpatterns = [
    # ... other urls in your project ...
    url(r"admin/", admin.site.urls),
]

然后运行

./manage.py migrate

开发环境安装

安装 sqlite

sudo apt-get install sqlite3 libsqlite3-dev

安装您的分支仓库

git clone git://github.com/<your_fork>/django-x509
cd django-x509/
python setup.py develop

安装测试需求

pip install -r requirements-test.txt

创建数据库

cd tests/
./manage.py migrate
./manage.py createsuperuser

启动开发服务器

./manage.py runserver

您可以通过 http://127.0.0.1:8000/admin/ 访问管理员界面。

使用以下命令运行测试

./runtests.py

在docker上安装和运行

从 Docker 文件构建

sudo docker build -t openwisp/djangox509 .

运行 Docker 容器

sudo docker run -it -p 8000:8000 openwisp/djangox509

设置

DJANGO_X509_DEFAULT_CERT_VALIDITY

输入:

整数

默认:

365

创建新的 x509 证书时的默认有效期(天数)。

DJANGO_X509_DEFAULT_CA_VALIDITY

输入:

整数

默认:

3650

创建新的证书颁发机构时的默认有效期(天数)。

DJANGO_X509_DEFAULT_KEY_LENGTH

输入:

整数

默认:

2048

新 CA 和新证书的默认密钥长度。

必须是以下值之一

  • 512

  • 1024

  • 2048

  • 4096

DJANGO_X509_DEFAULT_DIGEST_ALGORITHM

输入:

字符串

默认:

sha256

新 CA 和新证书的默认摘要算法。

必须是以下值之一

  • sha1

  • sha224

  • sha256

  • sha384

  • sha512

DJANGO_X509_CA_BASIC_CONSTRAINTS_CRITICAL

输入:

布尔值

默认:

True

在创建新的 CA 时,是否必须将 basicConstraint x509 扩展标记为“关键”。

DJANGO_X509_CA_BASIC_CONSTRAINTS_PATHLEN

输入:

intNone

默认:

0

创建新的 CA 时使用的 basicConstraint x509 扩展的 pathLenConstraint 的值。

当此值为正 int 时,它表示在有效的认证路径中可能跟随生成的证书的非自签发中间证书的最大数量。

将此值设置为 None 以避免施加任何限制。

DJANGO_X509_CA_KEYUSAGE_CRITICAL

输入:

布尔值

默认:

True

是否将 keyUsage x509 扩展标记为“关键”以用于新的 CA。

DJANGO_X509_CA_KEYUSAGE_VALUE

输入:

字符串

默认:

cRLSign, keyCertSign

新 CA 的 keyUsage x509 扩展的值。

DJANGO_X509_CERT_KEYUSAGE_CRITICAL

输入:

布尔值

默认:

False

是否将 keyUsage x509 扩展标记为“关键”以用于新的终端实体证书。

DJANGO_X509_CERT_KEYUSAGE_VALUE

输入:

字符串

默认:

digitalSignature, keyEncipherment

新终端实体证书的 keyUsage x509 扩展的值。

DJANGO_X509_CRL_PROTECTED

输入:

布尔值

默认:

False

是否应使用身份验证保护下载证书吊销列表的视图。

扩展 django-x509

OpenWISP项目的核心价值之一是软件可重用性,因此django-x509提供了一组基类,可以导入、扩展和重用来创建衍生应用程序。

为了实现您自己的django-x509版本,您需要执行本节中描述的步骤。

如有疑问,您可以参考测试项目中的代码以及示例应用程序,这些可以作为事实依据:只需复制并修改这些代码即可使django-x509的基本衍生版本工作。

前提:如果您计划使用此模块的定制版本,我们建议从开始就使用它,因为将数据从默认模块迁移到您的扩展版本可能耗时。

1. 初始化您的自定义模块

您需要做的第一件事是创建一个新的django应用程序,该应用程序将包含您自己的django-x509版本。

django应用程序只是一个python包(一个python脚本目录),在以下示例中,我们将此django应用程序称为myx509,但您可以根据需要命名。

django-admin startapp myx509

请注意,上述命令必须在目录中调用,该目录可在您的PYTHON_PATH中可用,以便您可以将结果导入到项目中。

现在您需要将myx509添加到您的settings.py中的INSTALLED_APPS,并确保已删除django_x509

INSTALLED_APPS = [
    # ... other apps ...
    # 'django_x509'  <-- comment out or delete this line
    "myx509"
]

有关如何使用django项目和django应用程序的更多信息,请参阅django文档

2. 安装 django-x509openwisp-utils

安装(并将其添加到项目的需求中)

pip install django-x509 openwisp-utils

3. 添加 EXTENDED_APPS

将以下内容添加到您的settings.py

EXTENDED_APPS = ["django_x509"]

4. 添加 openwisp_utils.staticfiles.DependencyFinder

openwisp_utils.staticfiles.DependencyFinder添加到您的settings.py中的STATICFILES_FINDERS

STATICFILES_FINDERS = [
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
    "openwisp_utils.staticfiles.DependencyFinder",
]

5. 添加 openwisp_utils.loaders.DependencyLoader

openwisp_utils.loaders.DependencyLoader添加到您的settings.py中的TEMPLATES

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "OPTIONS": {
            "loaders": [
                "django.template.loaders.filesystem.Loader",
                "django.template.loaders.app_directories.Loader",
                "openwisp_utils.loaders.DependencyLoader",
            ],
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    }
]

6. 继承 AppConfig 类

请参阅测试项目示例应用程序中的以下文件

您必须在项目中复制并修改这些代码。

有关AppConfig概念的更多信息,请参阅django文档中的“应用程序”部分

7. 创建您的自定义模型

这里我们提供了一个如何扩展django-x509基模型的示例。我们添加了一个简单的“详细信息”字段来展示修改。

from django.db import models
from django_x509.base.models import AbstractCa, AbstractCert


class DetailsModel(models.Model):
    details = models.CharField(max_length=64, blank=True, null=True)

    class Meta:
        abstract = True


class Ca(DetailsModel, AbstractCa):
    """
    Concrete Ca model
    """

    class Meta(AbstractCa.Meta):
        abstract = False


class Cert(DetailsModel, AbstractCert):
    """
    Concrete Cert model
    """

    class Meta(AbstractCert.Meta):
        abstract = False

您可以在类似的方式中在您的models.py文件中添加字段。

注意:有关如何使用、扩展或开发模型的疑问,请参阅django文档中的“模型”部分

8. 添加 swapper 配置

创建模型后,将以下内容添加到您的settings.py

# Setting models for swapper module
DJANGO_X509_CA_MODEL = "myx509.Ca"
DJANGO_X509_CERT_MODEL = "myx509.Cert"

myx509替换为步骤1中选择的名称。

9. 创建数据库迁移

创建并应用数据库迁移

./manage.py makemigrations
./manage.py migrate

有关更多信息,请参阅django文档中的“迁移”部分

10. 创建管理员界面

参考示例应用程序的admin.py文件

要向管理员引入更改,您可以通过以下两种主要方式之一进行操作,以下将描述这些方式。

注意:有关django管理员的工作方式或如何自定义的更多信息,请参阅django文档中的“django管理员站点”部分

1. 模拟补丁

如果您需要添加的更改相对较小,您可以求助于猴子补丁。

例如

from django_x509.admin import CaAdmin, CertAdmin

CaAdmin.list_display.insert(
    1, "my_custom_field"
)  # <-- your custom change example
CertAdmin.list_display.insert(
    1, "my_custom_field"
)  # <-- your custom change example

2. 继承管理员类

如果您需要引入重大更改,或者不想使用猴子补丁,您可以按照以下步骤进行

from django.contrib import admin
from swapper import load_model

from django_x509.base.admin import AbstractCaAdmin, AbstractCertAdmin

Ca = load_model("django_x509", "Ca")
Cert = load_model("django_x509", "Cert")


class CertAdmin(AbstractCertAdmin):
    pass
    # add your changes here


class CaAdmin(AbstractCaAdmin):
    pass
    # add your changes here


admin.site.register(Ca, CaAdmin)
admin.site.register(Cert, CertAdmin)

11. 创建根 URL 配置

请参考测试项目中的 urls.py 文件。

有关 django 中 URL 配置的更多信息,请参阅 django 文档中的“URL 分派器”部分

12. 导入自动化测试

在基于此模块开发自定义应用程序时,导入并运行基本测试也是一个好主意,这样您可以确保您引入的更改不会破坏 django-x509 的某些现有功能。

如果您需要添加破坏性更改,您可以覆盖基类中定义的测试以测试您自己的行为。

from django.test import TestCase
from django_x509.tests.base import TestX509Mixin
from django_x509.tests.test_admin import (
    ModelAdminTests as BaseModelAdminTests,
)
from django_x509.tests.test_ca import TestCa as BaseTestCa
from django_x509.tests.test_cert import TestCert as BaseTestCert


class ModelAdminTests(BaseModelAdminTests):
    app_label = "myx509"


class TestCert(BaseTestCert):
    pass


class TestCa(BaseTestCa):
    pass


del BaseModelAdminTests
del BaseTestCa
del BaseTestCert

现在,您可以使用以下命令运行测试

# the --parallel flag is optional
./manage.py test --parallel myx509

myx509替换为步骤1中选择的名称。

有关 django 中自动化测试的更多信息,请参阅 “Django 测试”

贡献

请参阅 OpenWISP 贡献指南

支持

查看 OpenWISP 支持渠道

变更日志

查看 更改记录

许可

查看 许可证

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。

源代码分发

django_x509-1.2.tar.gz (49.9 kB 查看散列值)

上传时间 源代码

构建分发

django_x509-1.2-py2.py3-none-any.whl (46.9 kB 查看散列值)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面