跳转到主要内容

A Django可重用应用程序,提供使用Django模板系统发送PGP加密和multipart电子邮件的能力。

项目描述

https://travis-ci.org/blag/django-secure-mail.svg?branch=master https://coveralls.io/repos/github/blag/django-secure-mail/badge.svg

blag 创建。从 #39#40django-email-extras 重新分叉,由 Stephen McDonald 编写。

简介

django-secure-mail是一个Django可重用应用程序,提供邮件后端以发送机会性签名和加密的电子邮件使用PGP。还提供了模型和管理上传的PGP密钥的管理员页面。

请注意,提供的后端仅在收件人已上传有效的公钥时才对发出的邮件进行签名。没有有效公钥的用户 不会 对其发出的邮件进行签名或加密。

依赖项

安装

安装django-secure-mail最简单的方法是直接从PyPi使用pip,运行以下命令

$ pip install django-secure-mail

否则,您可以下载django-secure-mail并直接从源安装它

$ python setup.py install

配置

  1. secure_mail添加到您的INSTALLED_APPS设置中,并运行数据库迁移

    $ python manage.py migrate secure_mail
  2. 在您的设置模块中将EMAIL_BACKEND设置为secure_mail.backends.EncryptingSmtpEmailBackend开发和测试中列出的开发/测试后端之一。

  3. SECURE_MAIL_GNUPG_HOME设置为一个包含GPG密钥环的目录。如果您正在运行多个Django节点,每个节点都需要对这个目录有读写访问。

  4. SECURE_MAIL_GNUPG_ENCODING变量设置为GPG可执行文件所需的编码。对于GPG 1.x通常是latin-1,对于GPG 2.x通常是utf-8

  5. 虽然发送加密邮件不是必需的,但强烈建议为外发邮件生成一个签名密钥。请按照生成签名密钥部分中的说明操作。所有将要发送外发邮件的节点都需要对由SECURE_MAIL_GNUPG_HOME指定的目录有读取访问权限。

还有其他配置选项可用。请参阅选项部分以获取完整列表。

生成签名密钥

添加私钥/公钥签名密钥对与导入公钥加密密钥不同,因为私钥将存储在服务器上。

该项目附带一个Django管理命令来生成和导出签名密钥:email_signing_key

您首先需要在项目的settings.py中设置SECURE_MAIL_SIGNING_KEY_DATA选项。这是一个字典,将直接作为关键字参数传递给GPG.gen_key(),因此请阅读并理解其文档中的所有选项。默认设置是

SECURE_MAIL_SIGNING_KEY_DATA = {
    'key_type': "RSA",
    'key_length': 4096,
    'name_real': settings.SITE_NAME,
    'name_comment': "Outgoing email server",
    'name_email': settings.DEFAULT_FROM_EMAIL,
    'expire_date': '2y',
}

您可能希望将key_type更改为仅签名类型的密钥,例如DSA,或过期日期。

设置完签名密钥设置后,使用--generate选项生成一个新的签名密钥

$ python manage.py email_signing_key --generate

要处理特定密钥,可以通过其指纹来识别它们

$ python manage.py email_signing_key 7AB59FE794A7AC12EBA87507EF33F601153CFE28

您可以使用以下命令将私钥打印到终端/控制台

$ python manage.py email_signing_key 7AB59FE794A7AC12EBA87507EF33F601153CFE28 --print-private-key

您可以通过传递密钥服务器主机名使用-k--keyserver选项将公钥签名密钥上传到一个或多个指定的密钥服务器

$ python manage.py email_signing_key 7AB59FE794A7AC12EBA87507EF33F601153CFE28 -k keys.ubuntu.com keys.redhat.com -k pgp.mit.edu

您也可以使用一条命令执行所有任务

$ python manage.py email_signing_key --generate --keyserver pgp.mit.edu --print-private-key

使用--help选项查看该命令的完整帮助文本。

生成签名密钥后,您需要配置secure_mail以使用它。将SECURE_MAIL_KEY_FINGERPRINT设置为您要使用的出站签名密钥的指纹。

选项

您可以在项目的settings.py模块中配置一些设置

  • SECURE_MAIL_GNUPG_HOME - 表示GNUPG密钥环的定制位置的字符串。如果您正在运行多个Django节点,则应将其设置为所有节点共享的目录,并且所有节点的gpg可执行文件都需要对该目录有读写访问。

  • SECURE_MAIL_USE_GNUPG - 控制是否使用PGP加密功能的布尔值。如果指定了SECURE_MAIL_GNUPG_HOME,则默认为True,否则为False

  • SECURE_MAIL_GNUPG_ENCODING - 本地gpg可执行文件期望的编码。此选项通过传递给str.encode函数。通常,对于GPG 1.x应设置为latin-1,对于GPG 2.x应设置为utf-8。有关更多信息,请参阅python-gnupg文档

  • SECURE_MAIL_FAILURE_HANDLERS - 一个将失败类型映射到错误处理程序点分路径表示的字典。有关详细信息和方法示例,请参阅错误处理部分。

  • SECURE_MAIL_ALWAYS_TRUST_KEYS - 跳过密钥验证,并假设使用密钥始终被完全信任。这实际上设置了--always-trust(或更现代的 GPG 版本的--trust-model)。有关此设置的更多详细信息,请参阅 GPG 文档中的--trust-model选项。

  • SECURE_MAIL_SIGNING_KEY_PASSPHRASE - 当生成或打印私有签名密钥时传递给 GPG 的密码短语。默认为''

  • SECURE_MAIL_SIGNING_KEY_DATA - 生成新签名密钥的密钥选项字典。有关更多详细信息,请参阅python-gnupg 文档

    默认设置

    {
        'key_type': "RSA",
        'key_length': 4096,
        'name_real': getattr(settings, 'SITE_NAME', ''),
        'name_comment': "Outgoing email server",
        'name_email': settings.DEFAULT_FROM_EMAIL,
        'expire_date': '2y',
        'passphrase': settings.SECURE_MAIL_SIGNING_KEY_PASSPHRASE,
    }
  • SECURE_MAIL_KEY_FINGERPRINT - 在签名外发邮件时使用的密钥指纹,必须存在于配置的密钥链中。

发送 PGP 加密电子邮件

一旦后端配置完成并由 EMAIL_BACKEND 设置指定,所有外发邮件都将被尝试签名和加密。这意味着如果消息被发送到数据库和 GPG/PGP 密钥链中具有有效公钥的接收者,后端将尝试为该接收者签名和加密外发邮件。

错误处理

此后端允许用户在以下对象加密失败时指定自定义错误处理程序

  • 纯文本消息本身

  • 任何消息附件

  • 任何消息替代品(例如:带纯文本回退的 HTML 邮件)

当引发异常时调用错误处理程序,并将引发异常传递给它们。

def handle_failed_encryption(exception):
    # Handle errors

def handle_failed_alternative_encryption(exception):
    # Handle errors

def handle_failed_attachment_encryption(exception):
    # Handle errors

默认错误处理程序简单地重新引发异常,但这可能不是所有情况都希望的。

为了帮助处理错误,该包提供了一些辅助函数,可以在自定义错误处理程序中使用

  • force_send_message - 接受未加密的消息作为参数,并发送消息而不尝试加密或签名它。

  • force_delete_key - 接受接收者的地址作为参数,并强制从数据库和 GPG/PGP 密钥链中删除所有密钥。

  • force_mail_admins - 接受未加密的消息和失败的地址作为参数。如果地址在 ADMINS 设置中,它将未加密地发送消息,否则,它将给管理员发送包含原始消息主题和原始预期接收者的消息。

  • get_variable_from_exception - 接受异常和变量名作为参数,然后回溯堆栈跟踪以找到第一个具有指定名称的变量。

要指定自定义错误处理程序,请将项目 settings.py 中的 SECURE_MAIL_FAILURE_HANDLERS 设置字典中的键设置为错误处理程序/的点分路径

SECURE_MAIL_FAILURE_HANDLERS = {
    'message': 'myapp.handlers.handle_failed_encryption',
    'alternative': 'myapp.handlers.handle_failed_alternative_encryption',
    'attachment': 'myapp.handlers.handle_failed_attachment_encryption',
}

您不必覆盖所有处理程序,可以覆盖您想要的任意多个或任意少。

开发和测试

如果您想扩展后端或创建自己的自定义后端,此包提供了一个后端混入(EncryptingEmailBackendMixin

class EncryptingLocmemEmailBackend(EncryptingEmailBackend, LocmemBackend):
    pass

有关在另一个 Django 应用中使用 EncryptingEmailBackendMixin 的实际、真实示例,请参阅来自django-emailhub项目的 emailhub.backends.secure_mail.EncryptingEmailBackendMixin

除了提供的EncryptingSmtpEmailBackend之外,这个包还包含了一些与内置Django后端相似的更多后端。

  • EncryptingConsoleEmailBackend

  • EncryptingLocmemEmailBackend

  • EncryptingFilebasedEmailBackend

数据库模型

PGP解释

使用python-gnupg,在secure_mail.models中定义了两个模型 - KeyAddress,分别代表一个PGP密钥和一个成功导入的密钥的电子邮件地址。这些模型纯粹是为了通过Django Admin导入和删除特定地址的密钥而存在的。

添加密钥时,密钥被导入到服务器的密钥环中,而Key模型的实例并未保存。密钥的电子邮件地址也被提取并保存为Address实例。

在发送电子邮件时,使用Address模型检查是否存在现有密钥,以确定是否应该加密电子邮件。当通过Django Admin删除Address时,密钥将从服务器的密钥环中删除。

其他Django应用程序

具有类似功能的其他Django应用程序包括:

  • django-email-extras - 提供两个函数,用于使用Django模板系统发送PGP加密的多部分电子邮件。还提供了一个在开发期间在浏览器中显示HTML电子邮件的邮件后端。

  • django-gnupg-mails - 提供了一个GnuPGMessage(Django的EmailMessage的子类),用于发送PGP/MIME签名电子邮件。

这两个应用程序都需要第三方应用程序开发者“选择”发送加密邮件。本项目自动为所有应用程序加密和签名所有发出的邮件。

项目详情


下载文件

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

源代码发行版

django-secure-mail-1.3.0.tar.gz (32.0 kB 查看哈希)

上传时间 源代码

构建发行版

django_secure_mail-1.3.0-py2.py3-none-any.whl (26.5 kB 查看哈希)

上传时间 Python 2 Python 3

由以下机构支持

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