无需OpenDKIM等工具,如何在Postfix配置中添加自定义私钥以实现DKIM?
无需OpenDKIM等工具,如何在Postfix配置中添加自定义私钥以实现DKIM?
Hey there,首先得明确一个核心事实:Postfix本身没有原生的DKIM签名功能,所以你没法只靠修改Postfix的配置参数直接指定私钥路径来完成DKIM签名。不过,如果你不想用OpenDKIM这类专门的DKIM工具,倒是可以借助Postfix的管道传输功能,配合系统自带的openssl写个简单脚本实现——这算是不用额外安装工具的方案,具体步骤如下:
先确保你的DKIM私钥权限正确,让Postfix能读取。假设私钥文件是
/etc/postfix/dkim/dkim-private.key,执行以下命令:chmod 600 /etc/postfix/dkim/dkim-private.key chown postfix:postfix /etc/postfix/dkim/dkim-private.key编写一个bash脚本用于签名,比如保存为
/etc/postfix/dkim-sign.sh,记得替换成你的域名和DKIM selector(比如selector用mail):#!/bin/bash # 替换成你的域名 DOMAIN="your-domain.com" # 替换成你的DKIM selector SELECTOR="mail" # 私钥文件路径 PRIVKEY="/etc/postfix/dkim/dkim-private.key" # 生成邮件正文的SHA256哈希(用于DKIM的bh字段) BODY_HASH=$(sed '/^$/q' | tr -d '\r' | openssl dgst -sha256 | awk '{print $2}' | xxd -r -p | base64 -w0) # 生成DKIM签名 SIG=$(openssl dgst -sha256 -sign "$PRIVKEY" <(sed '/^$/q' | tr -d '\r') | openssl enc -base64 -A) # 构造DKIM签名头 echo "DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=$DOMAIN; s=$SELECTOR; t=$(date +%s); bh=$BODY_HASH; h=From:To:Subject; b=$SIG;" # 输出原邮件内容 cat -给脚本加上执行权限:
chmod +x /etc/postfix/dkim-sign.sh chown postfix:postfix /etc/postfix/dkim-sign.sh修改Postfix的
master.cf,添加一个新的管道传输服务:dkim-sign unix - n n - - pipe flags=R user=postfix argv=/etc/postfix/dkim-sign.sh配置
main.cf,让Postfix发送邮件时使用这个签名服务:
如果要给所有发送的邮件签名,设置:default_transport = dkim-sign如果只想给特定域名签名,可以用传输映射:
transport_maps = hash:/etc/postfix/transport然后在
/etc/postfix/transport文件中添加:your-domain.com dkim-sign:别忘了生成映射数据库:
postmap /etc/postfix/transport最后重启Postfix使配置生效:
systemctl restart postfix
注意事项
这个脚本方案比较基础,只适合简单场景(比如单域名、固定selector),没法处理复杂邮件的边界情况(比如多部分MIME邮件、特殊编码的邮件头)。如果是生产环境,还是更推荐用OpenDKIM这类成熟工具——毕竟稳定性和维护性都要强得多。
备注:内容来源于stack exchange,提问作者Abu Shahrin
相关产品推荐
相关产品推荐

