0

我在 AWS EC2 下运行一个虚拟机,它是一个交钥匙 Linux,AFAIK 基于 Ubuntu / Debian。

我有一个在 Wordpress 上运行的网站,它拥有大约 10.000 人的 Newsletter 订阅者群,所以我想使用 Amazon SES 发送电子邮件,既便宜又好送达率。

问题是我必须自己对电子邮件进行 DKIM 签名...所以我使用的是基于 phpMailer 的 Wordpress 插件。

插件正确发送电子邮件,我的 SPF 记录很好,Amazon SES 运行良好,唯一的问题是 DKIM SIGN - 电子邮件未正确签名。

我被困@插件尝试执行openssl_pkey_get_private的点- 它应该返回一些东西,但它什么也不返回。它还会在 openssl_error_string() 对象上抛出错误,如下所示:

error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt

此错误不会停止脚本,我必须挖掘才能找到它。

好吧,然后脚本继续运行,因为它尝试使用空的 privKey 进行 openssl_sign。

结果是一封无法验证 DKIM 的电子邮件。以下是我的 Gmail 收件箱中的 DKIM 标头:

DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=233; s=ses;
    t=1336494976; c=relaxed/simple;
    h=From:To:Subject;
    d=joaodedeus.com.br;
    z=From:=20=3D?UTF-8?Q?Casa_Dom_In=3DC3=3DA1cio_de_Loyola?=3D=20<novidades@joaodedeus.com.br>
    |To:=20ddutra@cristalinacomunicacao.com.br
    |Subject:=20Test=20message=20from=20your=20WordPress=20blog;
    bh=Z+aAYGyi+5Sk1vIJcjjdy28rCuQ=;
    b=

以下是http://www.brandonchecketts.com/emailtest.php关于这封电子邮件的 DKIM 标志的说明:

result = fail
Details: OpenSSL error: data too small for key size

Message contains this DKIM Signature:
DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=270; s=ses;
    t=1336494983; c=relaxed/simple;
    h=From:To:Subject;
    d=joaodedeus.com.br;
    z=From:=20=3D?UTF-8?Q?Casa_Dom_In=3DC3=3DA1cio_de_Loyola?=3D=20
    |To:=20fb7oNYUCwX@www.brandonchecketts.com
    |Subject:=20Test=20message=20from=20your=20WordPress=20blog;
    bh=LVAqBtz26jyffwhHPhhXdLQOLhA=;
    b=

Signature Information:
v= Version:         1
a= Algorithm:       rsa-sha1
c= Method:          relaxed/simple
d= Domain:          joaodedeus.com.br
s= Selector:        ses
q= Protocol:        dns/txt
bh=                 LVAqBtz26jyffwhHPhhXdLQOLhA=
h= Signed Headers:  From:To:Subject
b= Data:

**Public Key DNS Lookup**
Building DNS Query for ses._domainkey.joaodedeus.com.br
Retrieved this publickey from DNS: v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYCkhM+6KDL5ndu4uhaP+jBp1BYBVN8Z8/BnXJ7JFc/HXcqW9Emt1vgmlcVqzBcHLFLk6GRRMbm4RIgOV1TCkr41ZTB8UYCjmUB6qqSY88hCdVIBQmTHgxq2DWhzlWiiOlqzeIQuMiMc0lgEaO8Zq3+d5gntPZXoxmTPQH32zA7wIDAQAB

以下是 phpmailer DKIM_Sign 函数尝试执行的操作:

  public function DKIM_Sign($s) { 
    $privKeyStr = file_get_contents($this->DKIM_private);
    if ($this->DKIM_passphrase!='') {
      $privKey = openssl_pkey_get_private($privKeyStr,$this->DKIM_passphrase);
    } else {
      $privKey = $privKeyStr;
    }
    $privKey = $privKeyStr;
    if (openssl_sign($s, $signature, $privKey)) {
      return base64_encode($signature);
    }
  }

问题是 openssl_pkey_get_private 什么都不返回。然后 openssl_sign 函数尝试使用EMPTY $privKey 进行签名。

$privKeyStr 正确读取密钥(file_get_contents),如果我回显它,它的内容与密钥相同。

$this->DKIM_passphrase 也是正确的,j0@0d3deus5

这是我按照 Wordpress Amazon SES DKIM Mailer 插件的说明生成密钥的方式:

openssl genrsa -des3 -passout pass:change-me -out .htkeyprivate 1024 && openssl rsa -in .htkeyprivate -passin pass:change-me -pubout -out .htkeypublic

当然,我将 pass:change-me 更改为正确的密码,j0@0d3deus5

我不能没有 DKIM。似乎hotmail严重依赖它。

这是我的 hotmail 帐户中的一个示例 -> 请注意,由于 DKIM 错误,它会直接进入垃圾文件夹。

x-store-info:4r51+eLowCe79NzwdU2kRyU+pBy2R9QCQ1WNUtV+VDcgEpN5KOTd9UyMPxTZoGJzS/h26zeEkCEVmH2zMg90yYxKot4DO0sKOsk98MBHLTNpOuzjxN5a42AR5Kz/5hEhx7XveDgnXqY=
Authentication-Results: hotmail.com; sender-id=pass (sender IP is 199.255.192.147) header.from=novidades@joaodedeus.com.br; dkim=permerror header.d=joaodedeus.com.br; x-hmca=pass
X-SID-PRA: novidades@joaodedeus.com.br
X-DKIM-Result: PermError
X-Message-Status: n:0:n
X-SID-Result: Pass
X-AUTH-Result: PASS
X-Message-Delivery: Vj0xLjE7dXM9MDtsPTA7YT0wO0Q9MjtHRD0yO1NDTD00
X-Message-Info: 11chDOWqoTkwLXPc6a+BBmU8PZ8Fa4uSQFuX56QoKCDSXsl9i7U4MyfUnfj2m3DtVW2PyTXMqyT/fwR9UtNuG4HNxTPmpoMwQBL+DemPeAzSpRs8zDKsN3uVpfPKiw+g1EW50e42Qd0=
Received: from a192-147.smtp-out.amazonses.com ([199.255.192.147]) by BAY0-MC4-F33.Bay0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4900);
     Tue, 8 May 2012 10:26:29 -0700
X-PHPMAILER-DKIM: phpmailer.anatta.com
DKIM-Signature: v=1; a=rsa-sha1; q=dns/txt; l=233; s=ses;
    t=1336497986; c=relaxed/simple;
    h=From:To:Subject;
    d=joaodedeus.com.br;
    z=From:=20=3D?UTF-8?Q?Casa_Dom_In=3DC3=3DA1cio_de_Loyola?=3D=20<novidades@joaodedeus.com.br>
    |To:=20dmnq_sl@hotmail.com
    |Subject:=20Test=20message=20from=20your=20WordPress=20blog;
    bh=X6QtcRzw7+F7llznB77GikLQnko=;
    b=

欢迎任何帮助。

最好的问候和对不起我的英语。

4

3 回答 3

0

我得到了这个插件的工作:

http://wordpress.org/extend/plugins/amazon-ses-and-dkim-mailer/

不要忘记授予私钥文件正确的权限。它不必位于根目录之下。

但是,我仍然无法签署 HTML 电子邮件。现在正在努力!

编辑:

通过确保对所有内容进行正确编码来获得正确的 DKIM。这有帮助:为什么 DOM 会更改编码?

于 2012-05-19T19:48:07.903 回答
0

我注意到如果您使用 SMTP API 发送 DKIM 是有效的,但使用 REST API DKIM 会失败。

这很奇怪,因为我正在使用该SendRawEmail操作来发送内容GetSentMIMEMessage

欢迎任何建议

于 2012-12-21T11:21:03.693 回答
0

如果您收到OpenSSL 错误:对于密钥大小而言数据太小,这意味着 SSL 无法基于 chroot/dev/urandom 或 DKIM_private 路径生成密钥是错误的 - 顺便说一句没有错误。

最好的方法是检查chrooted /urandom然后检查Selinux 是否有 php-fpm错误

https://stackoverflow.com/a/57977815/979474

于 2019-09-18T17:47:17.467 回答