可重复使用的django应用程序,用于生成和管理x509证书
项目描述
实现x509 PKI证书管理的简单可重复使用的django应用程序。
想帮助OpenWISP? 了解如何帮助我们成长.
当前功能
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
输入: |
int 或 None |
默认: |
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-x509 及 openwisp-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. 创建管理员界面
要向管理员引入更改,您可以通过以下两种主要方式之一进行操作,以下将描述这些方式。
注意:有关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 支持渠道。
变更日志
查看 更改记录。
许可
查看 许可证。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。