Python中使用DKIM签名邮件出现私钥解析错误如何解决?
DKIM签名报错修复方案
错误原因
- 私钥读取逻辑错误:你以文本模式读取PEM格式的私钥文件,之后又手动调用
encode()方法做二次编码,破坏了私钥原始的ASN.1结构,导致dkim库无法解析。 - 可选优化:当前生成的1024位RSA密钥安全强度不足,主流邮件服务商现在普遍要求DKIM密钥长度至少为2048位,否则即使签名成功仍可能被判为垃圾邮件。
修复步骤
第一步:修改私钥读取与签名逻辑
将原代码中私钥读取和dkim.sign的部分替换为如下内容:
# 用二进制模式直接读取私钥,不需要额外编码转换 with open(<private_key_path>, 'rb') as fh: dkim_private_key = fh.read() # 建议补充更多常用邮件头,避免后续服务商验证签名失败 headers = [b'To', b"From", b"Subject", b"Date", b"Message-ID"] sig = dkim.sign( message=message.as_bytes(), selector=str(dkim_selector).encode(), domain=domain.encode(), privkey=dkim_private_key, # 直接传入读取到的二进制私钥即可 include_headers=headers, )
第二步(可选,推荐):重新生成更高强度的密钥对
执行以下openssl命令生成2048位的RSA密钥对:
openssl genrsa -out privateKey.pem 2048 openssl rsa -in privateKey.pem -out publicKey.pub -pubout
第三步:检查DNS配置
确认你的域名DNS记录中已添加正确的DKIM记录:
- 记录类型:TXT
- 主机名:
default._domainkey(与你代码中的dkim_selector对应) - 记录值:
v=DKIM1; k=rsa; p=公钥内容,公钥内容需要去掉publicKey.pub文件中的首尾标记行(-----BEGIN PUBLIC KEY-----、-----END PUBLIC KEY-----)以及所有换行符,拼接为连续字符串。
内容的提问来源于stack exchange,提问作者Gabriel Martinez
相关产品推荐
相关产品推荐

