什么是DKIM
DKIM工作原理
密钥生成与存储:
- 发送域首先生成一对公钥和私钥。私钥保留在邮件服务器上,并用于签署即将发出的邮件。
- 公钥则作为DKIM记录存储在发送域的DNS记录中,通常是以TXT类型的DNS记录形式存在。
邮件签署:
- 当邮件从授权的服务器发出时,邮件服务器会使用私钥对邮件的部分或全部内容(通常是邮件头和主体的一部分)进行加密签名。
- 这个签名被添加到邮件头部的DKIM-Signature字段中,包含了一系列标识符(比如d=域名、s=选择器、bh=散列摘要、b=签名数据等)。
邮件验证:
- 当邮件到达接收方邮件服务器时,服务器会提取DKIM-Signature头信息,并查找与邮件中标识的域名和选择器相对应的DKIM记录。
- 接收方邮件服务器从DNS中获取到相应的公钥后,使用该公钥对邮件签名进行解密验证。
如果数字签名验证通过,则表明邮件内容在传输过程中未被篡改,并且邮件的确是从声称的域名授权的服务器发送的。
DKIM记录
selector._domainkey.domain.tld. TTL IN TXT "v=DKIM1; k=rsa; p=base64_public_key"
selector:
_domainkey:
domain.tld:
TTL:
IN:
Internet 类型,表明这是一个互联网资源记录。
TXT:
表明这是一个文本记录类型。
“v=DKIM1; k=rsa; p=base64_public_key”:
这是一个字符串值,其中包含了DKIM记录的具体参数:
- v: 版本号,这里是DKIM1,指DKIM协议版本1。
- k: 密钥类型,此处的rsa表示使用RSA算法的公钥。
- p: 公钥本身,它是私钥对应的公钥,经过Base64编码后的字符串形式,邮件服务器可以通过这个公钥验证邮件头部携带的DKIM签名。
此外,DKIM TXT记录还可能包含其他参数,如:
- t=:签名时间戳选项。
- s=:服务类型选项,用于限定签名的应用范围。
- h=:签名头列表,列出哪些邮件头会被纳入签名计算中。
- g=:公钥管理规范(GUA)选项,指向另一个URI,可用于更新公钥信息。
DKIM签名实际应用时,邮件头部会有DKIM-Signature字段(下文会做介绍),其中的d=(domain)、s=(selector)等标签与DNS中的DKIM TXT记录对应,共同完成邮件的身份验证过程。
DKIM配置示例
生成密钥
[root@localhost tmp]# openssl genrsa -out rsa.private 1024 Generating RSA private key, 1024 bit long modulus
.................++++++
........................++++++
e is 65537 (0x10001)
[root@localhost tmp]
# 下面命令是列出公钥信息
[root@localhost tmp]
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDATePPt6HZkegPZq3Rt5EJzl3
tVV8VEC3TroXsw11mf/JKXGETYtnjm08unmnjkemIGPKOwnuWCQNR3nEWwYzQAa1
2YXTHVuntqfdohDGlGQB7DHkvTp3R5bw4u16yrkZ816C6pLAXgHtd/YEffoZMehe
gX/upuGfo6yhScgEkQIDAQAB
-----END PUBLIC KEY-----
配置私钥
配置公钥
阿里云域名解析界面
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDATePPt6HZkegPZq3Rt5EJzl3tVV8VEC3TroXsw11mf/JKXGETYtnjm08unmnjkemIGPKOwnuWCQNR3nEWwYzQAa12YXTHVuntqfdohDGlGQB7DHkvTp3R5bw4u16yrkZ816C6pLAXgHtd/YEffoZMehegX/upuGfo6yhScgEkQIDAQAB
[root@localhost tmp]
;; ANSWER SECTION:
dkim._domainkey.mailabc.cn. 600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDATePPt6HZkegPZq3Rt5EJzl3tVV8VEC3TroXsw11mf/JKXGETYtnjm08unmnjkemIGPKOwnuWCQNR3nEWwYzQAa12YXTHVuntqfdohDGlGQB7DHkvTp3R5bw4u16yrkZ816C6pLAXgHtd/YEffoZMehegX/upuGfo6yhScgEkQIDAQAB"
如何验证邮件启用了DKIM签名?
启用DKIM签名后的信头
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mailabc.cn; s=dkim; h=Received:Date:From:To:Subject: Content-Type:MIME-Version:Message-ID; bh=u1bnFmVtzdAeVZ2afeXyEnM Ns4aUQjMDjQnsu5zkeds=; b=Jk7hVIFXExhLitRylf/MmzlWqB4Lf+zq+Y7/+Pa ZGnCkKMNcTjs3DAwcr99vgTlMaVXhKMusDGuC7OVUFAPMyFlnlXbWyXgR/SNdP2Y DmpA2TWnJ260aNsgx4a56sR4RSrMBCZG0hZQZ3jeoGdIgI1C7sXlLvgAvouWqSvp F3kw=
以上述信头为例,DKIM-Signature内容解释如下: