Tom*_*bes 10 c# email asp.net-mvc dkim
基于这个问题,我决定签署从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);
}
}
Run Code Online (Sandbox Code Playgroud)
我在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
Run Code Online (Sandbox Code Playgroud)
我的DNS记录是:
@ IN TXT "v=dkim1; s=mail; p=migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqdnov2pxnjmghdpxw5wpypk1rf7 kxs+5ouvh6f0hraryncku6wbvq+xovbgxz1kuddcb/s9o8wquftxrlffniik3wbm qc+upm+ndloxcxwy0bb2iktbgnmndjiexm/z0npaviwzebr2k6vqdzbp+lmcuece bwasqgw2fki5ospb4qidaqab"
Run Code Online (Sandbox Code Playgroud)
更新:
我修复了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 ----
Run Code Online (Sandbox Code Playgroud)
所以我只是将内容(注释行除外)复制到DNS记录中,然后从checker获得以下输出:
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.
Run Code Online (Sandbox Code Playgroud)
正如我们在评论中指出的那样 - 您的代码很好,但是您的公钥有问题。首先,它的 dns txt 记录中有空格,这是它不能有的。那么,您的公钥 (SSH2) 格式错误。验证签名的工具需要不同的格式(常规 PEM RSA),应如下所示:
--- BEGIN RSA PUBLIC KEY ---
MII ....
--- END RSA PUBLIC KEY ---
Run Code Online (Sandbox Code Playgroud)
因此,与您的私钥相同。您可以将 SSH2 密钥转换为 PEM
ssh-keygen -f output.pub -m 'PEM' -e > public.pem
Run Code Online (Sandbox Code Playgroud)
output.pub
SSH2 格式的公钥在哪里?使用这样的密钥(并且 DNS 记录中没有空格)它应该可以正常工作,假设您将其放入正确的 dns 记录 - key_selector._domainkey.your.domain。