S/MIME 电子邮件签名
S/MIME - 安全/多用途互联网邮件扩展 - 是一种用于对多用途互联网邮件扩展(MIME)数据进行公钥加密和签名的标准。Mautic 支持 S/MIME 电子邮件签名,以帮助验证电子邮件的真实性,并确保电子邮件内容在传输过程中未被修改。
目前,S/MIME 签名仅在使用 SMTP 电子邮件传输时可用。它不适用于基于 API 的电子邮件传输。
什么是 S/MIME 电子邮件签名?
S/MIME 电子邮件签名可为您的电子邮件添加数字签名,使收件人能够:
- 验证发件人身份 - 确认电子邮件确实来自您的组织
- 确保电子邮件完整性 - 验证电子邮件内容在传输过程中未被篡改
- 建立信任 - 向收件人展示您的组织遵循电子邮件安全最佳实践
此实现仅专注于对电子邮件进行**签名**。它不加密电子邮件正文,这意味着任何有权访问的人仍可阅读电子邮件内容。许多电子邮件客户端不支持 S/MIME 加密,因此签名可以在不产生兼容性问题的情况下提供验证。
有关 S/MIME 及其使用原因的更多详细信息,请阅读 mailbox 的这篇 S/MIME: secure Email encryption and signature 文章。
工作原理
当您开启并正确配置 S/MIME 签名时:
- Mautic 使用与发件人电子邮件地址对应的私钥签署每一封外发电子邮件
- Mautic 将签名作为
smime.p7s文件附加到电子邮件中 - 使用支持 S/MIME 的电子邮件客户端的收件人可以使用公钥证书验证签名
- 如果发件人的电子邮件地址没有对应的证书,Mautic 会在不报错的情况下发送未签名的电子邮件
开启 S/MIME 签名
通过 Mautic 配置文件开启 S/MIME 签名。该功能在 Web 界面中不可用。
在开启 S/MIME 签名之前,请确保您使用的是 SMTP 电子邮件传输。此功能不适用于基于 API 的电子邮件传输。
配置
将以下配置参数添加到您的 app/config/local.php 文件中:
<?php
$parameters = array(
// ... 其他配置 ...
'smime_signing_enabled' => true,
'smime_certificates_path' => '%kernel.project_dir%/var/smime_certificates',
);
配置参数
smime_signing_enabled
设置为 true 可开启 S/MIME 电子邮件签名,设置为 false 则关闭。
默认值:false
smime_certificates_path
Mautic 存储 S/MIME 证书的目录的绝对路径。您可以使用 %kernel.project_dir% 来引用您的 Mautic 安装目录。
默认值:%kernel.project_dir%/var/smime_certificates
生成 S/MIME 证书
从 Mautic 发送电子邮件的每个电子邮件地址都需要自己的证书对:
- 一个**公钥证书** -
.crt文件 - 用于验证您的身份 - 一个**私钥** -
.pem文件 - 用于签署电子邮件
自签名证书
出于测试目的,您可以创建自签名证书。但是,对于生产环境,您应从受信任的证书颁发机构获取证书。
要创建自签名证书和私钥:
# 创建私钥和证书签名请求
openssl req -newkey rsa:4096 -nodes -keyout sender@example.com.pem -out sender@example.com.csr
# 创建有效期为 1 年的自签名证书
openssl x509 -req -days 365 -in sender@example.com.csr -signkey sender@example.com.pem -out sender@example.com.crt
将 sender@example.com 替换为您用于从 Mautic 发送电子邮件的实际电子邮件地址。
生产环境证书
对于生产环境,请从受信任的证书颁发机构(CA)获取 S/MIME 证书。许多证书颁发机构提供 S/MIME 证书,该过程通常包括:
- 生成证书签名请求 (CSR)
- 将 CSR 连同身份验证文件一起提交给 CA
- 从 CA 接收签名的证书
要查看此过程在实际中如何运作的示例,请参阅 Mozilla 的这篇 Mozilla guide on obtaining S/MIME certificates 文章。
安装证书
证书文件命名
根据证书对应的电子邮件地址命名证书:
- 公钥证书:
email@example.com.crt - 私钥:
email@example.com.pem- 纯文本 - 或email@example.com.pem.enc- 加密
将 email@example.com 替换为实际的发件人电子邮件地址。
文件名中的电子邮件地址必须与发送电子邮件时使用的**发件人**地址完全匹配。
证书目录结构
将您的证书文件放置在 smime_certificates_path 指定的目录中:
/var/smime_certificates/
├── admin@example.com.crt
├── admin@example.com.pem
├── support@example.com.crt
└── support@example.com.pem
设置权限
确保 Web 服务器用户对证书目录和文件具有读取权限:
# 设置所有者(将 www-data 替换为您的 Web 服务器用户)
chown -R www-data:www-data /path/to/mautic/var/smime_certificates
# 设置目录权限
chmod 755 /path/to/mautic/var/smime_certificates
# 设置证书权限
chmod 644 /path/to/mautic/var/smime_certificates/*.crt
chmod 600 /path/to/mautic/var/smime_certificates/*.pem
私钥(.pem 文件)应具有限制性权限(600),以防止未经授权的访问。
加密私钥
为了增强安全性,您可以使用 Mautic 的加密系统加密您的私钥。Mautic 将加密的私钥以 .pem.enc 扩展名存储。
加密的好处
加密私钥增加了额外的安全层:
- 如果有人入侵了您的服务器,没有 Mautic 的密钥,他们就无法使用加密的密钥
- 加密使用 Mautic 实例配置中的
secret_key - Mautic 在需要签署电子邮件时自动解密密钥
确保您在 app/config/local.php 文件中配置了 secret_key。Mautic 在安装过程中会自动创建它。
创建加密密钥
要加密现有的私钥:
- 确保您的
secret_key已在app/config/local.php中配置 - 使用 Mautic 的加密辅助工具或命令行:
# 使用 PHP 加密密钥
php -r "
require 'app/config/local.php';
require 'app/bundles/CoreBundle/Helper/EncryptionHelper.php';
\$helper = new \Mautic\CoreBundle\Helper\EncryptionHelper(
new \Mautic\CoreBundle\Helper\CoreParametersHelper(new \Symfony\Component\DependencyInjection\ParameterBag\ParameterBag(\$parameters))
);
\$key = file_get_contents('var/smime_certificates/sender@example.com.pem');
file_put_contents('var/smime_certificates/sender@example.com.pem.enc', \$helper->encrypt(\$key));
"
- 创建加密版本后,为了安全起见,您可以删除纯文本的
.pem文件 - 如果存在,Mautic 会自动使用加密版本(
.pem.enc)
密钥优先级
当查找私钥时,Mautic 按以下顺序检查:
- 加密密钥:
email@example.com.pem.enc - 纯文本密钥:
email@example.com.pem
如果两者都存在,则加密版本优先。
测试 S/MIME 签名
配置 S/MIME 签名后:
- 使用已配置证书的电子邮件地址从 Mautic 发送一封测试邮件
- 在您的电子邮件客户端中查看电子邮件的来源/标头
- 查找以下表明 Mautic 已签署电子邮件的迹象:
- Content-Type 标头包含
multipart/signed - 有一个名为
smime.p7s的附件 - protocol
application/x-pkcs7-signature
- Content-Type 标头包含
- 如果您的电子邮件客户端支持 S/MIME,您应该会看到一个验证指示符,例如印章或复选标记
S/MIME 故障排除
电子邮件未被签名
如果 Mautic 未签署电子邮件,请检查:
- S/MIME 已启用 - 验证
smime_signing_enabled在local.php中设置为true - 使用 SMTP 传输 - S/MIME 仅适用于 SMTP。检查您的电子邮件传输设置
- 证书存在 - 确认
.crt和.pem文件存在于证书目录中 - 文件名正确 - 证书文件名必须与发件人电子邮件地址完全匹配
- 文件权限 - Web 服务器用户必须对证书文件具有读取权限
- 检查日志 - 在
var/logs/mautic_prod.log中查找任何与 S/MIME 相关的错误
未找到证书错误
如果您在日志中看到证书错误:
- 验证
smime_certificates_path在您的配置中是否正确指定 - 确保 Mautic 正确命名了证书文件(
email@example.com.crt和.pem) - 确保文件名中的电子邮件地址与发件人地址完全匹配
- 验证文件权限是否允许 Web 服务器用户读取文件
证书验证错误
如果收件人报告证书验证错误:
- 自签名证书 - 默认情况下不受信任。收件人需要手动信任它们
- 证书已过期 - 检查您的证书有效日期
- 证书链 - 确保您使用的是来自证书颁发机构的完整证书链
- 域名不匹配 - 证书中的电子邮件地址必须与发件人地址匹配
性能考量
S/MIME 签名会为每封电子邮件增加少量处理开销:
- Mautic 为每封电子邮件单独执行签名
- 开启 S/MIME 后,Mautic 会关闭批量电子邮件处理(基于令牌的发送)以确保正确签名
- 对于高容量电子邮件发送,请监控您的服务器资源
限制
Mautic 中 S/MIME 签名的当前限制:
- 仅限 SMTP - S/MIME 签名仅适用于 SMTP 电子邮件传输。不支持基于 API 的传输。
- 仅签名 - 此实现签署电子邮件,但不加密电子邮件正文。内容仍然可读。
- 无批处理 - 开启 S/MIME 后,Mautic 会关闭批量电子邮件处理(基于令牌的发送)以确保正确签名。
- 每次请求一封邮件 - Mautic 单独发送每封电子邮件,而不是分批发送。
如果您开启了 S/MIME 签名但使用的是非 SMTP 传输,Mautic 会强制每次请求只发送一封电子邮件,但签名可能无法正常工作。始终使用 SMTP 进行 S/MIME 签名。
其他资源
有关 S/MIME 的更多信息:
S/MIME: secure Email encryption and signatureMozilla guide on obtaining S/MIME certificatesOpenSSL Documentation
相关文档
/configuration/settings- 通用电子邮件设置配置/channels/emails- 电子邮件概述与管理/configuration/cron_jobs- 设置用于电子邮件发送的 Cron 任务
谢谢你的反馈!