簡體   English   中英

在C#中簽名電子郵件

[英]Signing email in C#

基於這個問題,我決定簽署從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記錄中,然后從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.

正如我們在評論中指出的那樣 - 您的代碼很好,但是您的公鑰存在問題。 首先,它在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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM