【问题标题】:Signing email in C#在 C# 中签署电子邮件
【发布时间】:2017-06-12 21:10:36
【问题描述】:

基于此question,我决定签署从 ASP.NET.MVC 发送的电子邮件以降低电子邮件的垃圾邮件分数,但我在某处有一些错误。

代码:

    public void SendEmail(MailMessage mailMessage)
    {
        string domain = "kup-nemovitost.cz";

        var message = MimeMessage.CreateFromMailMessage(mailMessage);

        HeaderId[] headers = new HeaderId[] { HeaderId.From, HeaderId.Subject, HeaderId.Date };
        DkimCanonicalizationAlgorithm headerAlgorithm = DkimCanonicalizationAlgorithm.Relaxed;
        DkimCanonicalizationAlgorithm bodyAlgorithm = DkimCanonicalizationAlgorithm.Relaxed;

        string dkimPath = Path.Combine(ConfigHelper.GetDataPath(), "DKIM");
        string privateKey = Path.Combine(dkimPath, "kup-nemovitost.cz.private.rsa");

        DkimSigner signer = new DkimSigner(privateKey, domain, "mail")
        {
            SignatureAlgorithm = DkimSignatureAlgorithm.RsaSha1,
            AgentOrUserIdentifier = "@" + domain,
            QueryMethod = "dns/txt",
        };         

        message.Prepare(EncodingConstraint.SevenBit);
        message.Sign(signer, headers, headerAlgorithm, bodyAlgorithm);

        using (var client = new MailKit.Net.Smtp.SmtpClient())
        {
            client.Connect("localhost", 25, false);
            client.Send(message);
            client.Disconnect(true);
        }          
    }

我在http://www.isnotspam.com查看结果,输出如下:

DKIM check details:
----------------------------------------------------------

Result: invalid
ID(s) verified: header.From=no-reply@kup-nemovitost.cz
Selector=mail
domain=kup-nemovitost.cz
DomainKeys DNS Record=mail._domainkey.kup-nemovitost.cz

我的 DNS 记录是:

@ IN TXT "v=dkim1; s=mail; p=migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdnov2pxnjmghdpxw5wpypk1rf7 kxs+5ouvh6f0hraryncku6wbvq+xovbgxz1kuddcb/s9o8wquftxrlffniik3wbm qc+upm+ndloxcxwy0bb2iktbgnmndjiexm/z0npaviwzebr2k6vqdzbp+lmcuece bwasqgw2fki5ospb4qidaqab"

更新

我修复了 DNS 记录中的一些问题,我在 dkimcore.org 找到了更好的在线检查器

我的公钥仍然存在验证问题。我使用 puttyGen (ppk) 生成了 1024 RSA 并将其转换为 RSA 格式。 PuttyGen 的原始文件是:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20170606"
AAAAB3NzaC1yc2EAAAABJQAAAIEAiyEwx+Idlf/Qp2fTYrQMwV3MuF9W7yaKDMHk
hzoH+MqWKtNDngQoJcmbyrkMeF0VLYo246ma3gPZh9cDL7i8ygOYKagbyUjgtZFz
y+et0tY/+G/IZNaHiQp0QuG/J71uZrl4Jlgkq+0s5bZxpRR45aRpcG1HQMIm6Ku7
lgmOt88=
---- END SSH2 PUBLIC KEY ----

所以我只是将内容(注释行除外)复制到 DNS 记录,然后我从检查器得到以下输出:

p=  AAAAB3NzaC1yc2EAAAABJQAAAIEAiyEwx+Idlf/Qp2fTYrQMwV3MuF9W7yaKDMHkhzoH+MqWKtNDngQoJcmbyrkMeF0VLYo246ma3gPZh9cDL7i8ygOYKagbyUjgtZFzy+et0tY/+G/IZNaHiQp0QuG/J71uZrl4Jlgkq+0s5bZxpRR45aRpcG1HQMIm6Ku7lgmOt88=
This doesn't seem to be a valid RSA public key: RSA.xs:178: OpenSSL error: wrong tag at blib/lib/Crypt/OpenSSL/RSA.pm (autosplit into blib/lib/auto/Crypt/OpenSSL/RSA/new_public_key.al) line 91.

【问题讨论】:

  • 好的,所以你在某处有错误。与实际发生的事情相比,期望的行为是什么?
  • 所需行为是isnotspam.com 应确认电子邮件已使用 DKIM 签名并通过结果。
  • 像 SendGrid 这样的服务有一个非常慷慨的免费套餐,可以解决大部分不让您的电子邮件进入垃圾邮件箱的负担。
  • 您能否至少附上 isnotspam 失败的原始电子邮件(标题 + 正文)?
  • 您现在拥有 SSH2 格式的密钥,您需要另一种格式 (PEM)。它应该以---BEGIN RSA PUBLIC KEY --- MII.... 开头。如果您不知道如何使用您的工具生成此类密钥 - 请显示您现在使用的命令,我可以帮助修复它。

标签: c# asp.net-mvc email dkim


【解决方案1】:

正如我们在 cmets 中发现的那样 - 您的代码很好,但是您的公钥有问题。首先,它在 dns txt 记录中有空格,这是它不能有的。然后,您的公钥 (SSH2) 格式错误。验证签名的工具需要不同的格式(常规 PEM RSA),应该如下所示:

--- BEGIN RSA PUBLIC KEY ---
MII ....
--- END RSA PUBLIC KEY ---

因此,与您的私钥相同。您可以使用

将 SSH2 密钥转换为 PEM
ssh-keygen -f output.pub -m 'PEM' -e > public.pem

output.pub 是 SSH2 格式的公钥。使用这样的密钥(并且在 DNS 记录中没有空格)它应该可以正常工作,假设您将其放入正确的 dns 记录 - key_selector._domainkey.your.domain。

【讨论】:

    猜你喜欢
    • 2016-08-05
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2021-09-29
    • 2016-08-25
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多