广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 4129 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
笑笑 会员卡 葫芦墩家族
个人文章 个人相簿 个人日记 个人地图
发文大师奖
头衔:    
风云人物
级别: 风云人物 该用户目前不上站
推文 x137 鲜花 x523
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x0
[虚拟主机][教学] [转贴] Sendmail + Domain Key 实作
Sendmail Domain Key 教学
欢迎转载 ,但不得作为商业用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>
最后修正时间: 2006/07/24 00:10
转载时请保持此一宣告

Sendmail + DomainKey 实作分享

前言
Domain Key (DKIM) 目前尚无标准(RFC) 文件,目前 IETF Draft 只到 04 版(最终到 -06),估计还要一年多才会形成 RFC,
相关讯息可参考 IETF DKIM Working Group (http://www.ietf.org/html.cha...harter.html), 及
Domain Key 网站 ( http://mipassoc...dkim/ ), 这个网站可以找到各种 MTA 如何 support DKIM 的文件及 Source

Domain Key 主要是由 Yahoo 所推的网域名称和邮件伺服器间认证方式, Server 所发出来的信件使用 private key
加密必要的表头(Ex: From:Subject:Date),目的 MTA 在收到信件时取出这些表头,以 public key (从 DNS 中取出,
后述)进行表头验证,从验证的结果中得到一个 return 值,并针对这些值由目的 MTA 决定动作 (Accept/Reject/Discare..),
所以, MTA 要支援 Domain Key, 不同的 MTA 做法稍有不同,仅以个人较熟悉之 sendmail 进行介绍,以供大家参考.
(据闻 postfix 也支援 Milter , 但个人未用过 postfix,故留待有缘人自己研究了,或上述专门介绍 DKIM 的网站中,
也有各种 MTA 的做法).

最后,值得一提的是, Yahoo 目前使用的 DKIM 版本是 02 版,而目前最新的 Draft 到 04 版,最近的 DKIM Milter 则支援
0.3 版,所以,我们的介绍是配合 Yahoo 使用 DKIM 能支援 02 版的 dk-filter 0.4.1

1. sendmail 准备工作

1.1 sendmail 需支援 Milter
不论 DKIM 也好, SPF 也罢,在 Sendmail 中实现都是以 Milter (Mail Fitler) 来做, Milter 的功能是在 SMTP 协商
的过程式去连接一个外部程式进行检验,例如 ehlo/mail from/rcpt to/data 等,每个步骤的过程都可以连接一个外部程
式进行检验及行为处理,所以,若 user 有需要可以修改 Envelpe To, Header 等,而 DKIM 的 filter 主要的工作是进行
加 Header 及取 Header 验证的工作,故只有在 Data 上做文章. 所以您的 sendmail 有没有支援 Milter 决定了你可否
直接使用 DKIM filter (dk-filter),或是必需重新安装 sendmail


复制程式
# 检验 sendmail 是否支援 Milter (-d0 表示要看 Complier 参数,不同的 -dX.Y 各有不同意义)
[root@eai1 mail]# sendmail -d0 </dev/null
Version 8.13.7
 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7
                NAMED_BIND NETINET NETUNIX NEWDB PIPELINING SASLv2 SCANF
                STARTTLS USERDB XDEBUG

若上面的 Compiled with 有出现 MILTER 即代表了您的 sendmail 巳支援 Milter, 那是最好不过的了,让您少掉了不少
预备工作,

1.2 我的 sendmail 目前不支援 Milter
此时建议您依自己的情况找一个支援 Milter 的 RPM 或是以 Source RPM 自己重做 RPM (rpmbuild),另外您也可以选择
以 tarball 的方式做, tarball 的方式做会复杂许多,建议您多参考 Sendmail Compiling 一节说明
http://www.sendmail.org/...ling.html
以我个人的例子来做介绍

复制程式
$>cd sendmail-8.13.7
# 以下您也可以自己用 editor 编辑,若不了解请多参考上述 compiling link 的说明,篇幅所限(其实是我想偷懒),无法
# 一一说明
$>cat <<EOF >devtools/Site/site.config.m4
dnl # 可以在 cf 档中使用 regexp
APPENDDEF(`confMAPDEF',`-DMAP_REGEX')
dnl # BDB , 这个是一定要的
APPENDDEF(`confENVDEF',`-DNEWDB')
dnl # MILTER 支援
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
dnl # MILTER 不以 root 启动
APPENDDEF(`conf_libmilter_ENVDEF', `-D_FFR_MILTER_ROOT_UNSAFE')
dnl # DNS 的一些函数
APPENDDEF(`confENVDEF',`-DDNSMAP')
dnl # MILTER,这个可以不用,但个人习惯除了 sendmail_ENVDEF 外,还会再加一次 ENVDEF
APPENDDEF(`confENVDEF',`-DMILTER')
dnl # STARTTLS, SMTPS 的东西
APPENDDEF(`confENVDEF',`-DSTARTTLS')
APPENDDEF(`conf_sendmail_ENVDEF', `-DSTARTTLS')
dnl # Complier 时所需的一些 include/lib 相关位置
APPENDDEF(`conf_sendmail_LIBS', `-lssl -lcrypto')
APPENDDEF(`confLIBDIRS',`-L/usr/local/ssl/lib -L/usr/lib -L/usr/local/lib')
APPENDDEF(`confINCDIRS',`-L/usr/local/ssl/include -I/usr/include/sasl')
APPENDDEF(`confINCDIRS',` -I/usr/include -I/usr/local/include')
APPENDDEF(`confLIBS',`-lsasl2 -lcrypt -lssl -lcrypto -lmilter')
dnl # SASL , SMTP AUTH 的东西
APPENDDEF(`confENVDEF',`-DSASL2')
define(`confAUTH_OPTIONS',`p')
dnl # TCP WRAPPER , 以便可以使用 /etc/hosts.{allow,deny} 的一些功能
APPENDDEF(`confENVNEF',`-DTCPWRAPPERS')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap')
EOF

$>sh Build -c
#这里会进行 Compiling,理论上不会有什么 Error , 如果有 Error 需视状况处理

$>service sendmail stop
$>service sendmail stop
$>service sendmail stop
$>killall -9 sendmail
$>sh Build install

# 下面路径 sendmail-cf 视您的环境而定,主要是看您的 sendmail.mc 中的 include 位置为何
$>cp -Rf cf/* /usr/share/sendmail-cf   
$>cd /etc/mail

# 直接使用原来的 sendmail.mc 即可
$>m4 sendmail.mc > sendmail.cf
$>service sendmail start

# 检查 sendmail Compiling 的项目,是否出现 MILTER
$>sendmail -d0 </dev/null

以上只是做 sendmail 的升级,安装,支援 Milter, 重新启动等等动作,目的是要让您的 sendmail 可以加载其他的 Mail Filter,
如果您的 sendmail 巳经支援 MILTER 那重做 SENDMAIL 是不需要的,不过 dk-filter 要求 sendmail 最低版本需 8.13.X,
所以若您不是使用 8.13.X ,您必需找 rpm 来装或是自己用 tarball 来装(用 Source RPM 也很简单的),如果您的 Sendmail 巳是
8.13.X 且支援 MILTER,那第一节部份您是可以不用管的.

2. 安装 Domain Key Filter (dk-filter)
2.1 下载与安装
project 网址为 https://sourceforge.net/...k-milter/ , 撰写本文时版本为 0.5.1,因为 DKIM 的标准尚
在讨论中,但基本鶵形巳经有共识,相信未来只是 wording 的工作,但是内容并不会有太大的改变
(注:我用 0.5.1 无法通过 Yahoo 的 DKIM 认证, 0.4.1 是最多人用的)


复制程式
$>wget http://superb-west.dl.sourceforge.net/sourceforge/dkim-milter/dkim-milter-0.4.1.tar.gz
$>tar -zxvf dkim-milter-0.4.1.tar.gz
$>cd dkim-milter-0.4.1
$>sh Build -c
# 如果 compiling 时有 SSL 相关的函数出错,请修改 dk-filter/Makefile.m4 中的
# APPENDDEF(`confINCDIRS', `-I/usr/local/ssl/include ')
# APPENDDEF(`confLIBDIRS', `-L/usr/local/ssl/lib ')
# 到对应的路径
$>sh Build install



2.2 了解 dk-filter 参数的涵意

复制程式
$>dk-filter -h
-a peerlist     file containing list of hosts to ignore   # 那些 host 不做 DKIM check
-A              auto-restart                              # dk-filter 死掉时自动重启
-b modes        select operating modes                    # s (singer) / v (verify) 预设为 sv
-c canon        canonicalization to use when signing      # 预设是 simple (表头不改变),
                                                          # 另外为 relaxed (表头可能修正,去除空白,不换行等等)
-C config       configuration info (see man page)         # 设定档,详见下述
-d domlist      domains to sign                           # 要 sign 的 domain 列表,以逗号区隔
-D              also sign subdomains                      # 一并 sign -d 之下 domain 的 sub-domain
-f              don't fork-and-exit                       # 前景执行
-h              append identifying header                 # 会在 Mail Header 中加入 X-DomainKeys 资讯
-H              sign with explicit header lists           # DomainKey-Signature 中说明 sign 的 header 资讯
-i ilist        file containing list of internal (signing) hosts # 只做 sign, 不做 verify,预设为 127.0.0.1
-I elist        file containing list of external domain clients  # 透过此主机转信之来源做 sign,不做 verify
-l              log activity to system log                # log 必要讯息到 maillog
-m mtalist      MTA daemon names for which to sign        # MTA 名字,也就是 DaemonPortOptions 中的 Name,预设是全部
-M macrolist    MTA macros which enable signing           # 不详,没用过
-o hdrlist      list of headers to omit from signing      # 那些 Header 不 sign,Ex: -o to,subject,date , From 一定要 sign
-P pidfile      file to which to write pid                # pid file 路径
-s keyfile      location of secret key file               # private key 
-S selector     selector to use when signing              # selector,会以 selector._domainkey.Domain 进行 type=TXT 查询 
-u userid       change to specified userid                # 以什么身份执行
-V              print version number and terminate        # 版本资讯


上述参数的 hosts 格式可以是 IP,Domain 例如:

复制程式
# hosts format for dk-filter
1.2.3.4
100.100/16
eai1.twnic.tw
.twnic.net.tw

上述参数 -C config 档中的设定方法,

复制程式
#result=action,result=action,...,括号内为简写
#Results: 
# 依序为认证失败,DNS 错误,Milter 内部错误,没有 DKIM 栏位,没有签章栏位(b=)
badsignature(bad)
dnserror(dns)
internal(int)
nosignature(no)
signature-missing(miss)

#action:
# 依序为 同意,丢弃,临时失败,拒绝
accept(a)
discard(d)
tempfail(t)
reject(r)

所以若要拒绝没有 DKIM 的信件,对于内部错误回应临时失败,拒绝认证失败的信件即为 -C bad=r,no=r,int=t

2.3 建立 dk-filter running script
建立 /etc/sysconfig/dk-filter 档

复制程式
#!/bin/bash

#以下请自行调整,主要为对应启动时的参数
SOCKET="inet:8891@localhost"
CANON="simple"
DOMAIN=$(hostname)
PRIVATE_KEY="/etc/mail/abelyang.private"
USER=smmsp
HEADER_IGNORE="subject,date,message-id,to"
SELECTOR=$(date +%Y)
FILTER_RULE="bad=r,dns=r,int=r,no=a,miss=r"

建立 /etc/rc.d/init.d/dk-filter 启动程式
(这里有点随便写,能够 start/stop 而以,但不能对应到 chkconfig 使用 =.=)

复制程式
#!/bin/bash

RETVAL=0
prog="dk-filter"

if [ -x /usr/bin/$prog ] ; then
    PRO无法使用之字串R=/usr/bin
elif [ -x /usr/local/bin/$prog ] ; then
    PRO无法使用之字串R=/usr/local/bin
else
    exit 0
fi


SOCKET="inet:8891@localhost"
# Source configuration
if [ -f /etc/sysconfig/$prog ] ; then
    . /etc/sysconfig/$prog
fi

start() {
    ulimit -s 2048
    $PRO无法使用之字串R/$prog -H -h -l -P /var/run/dk-filter.pid   \
        $([ -n "$FILTER_RULE" ] && echo "-C $FILTER_RULE") \
        $([ -n "$DOMAIN" ] && echo "-d $DOMAIN") \
        $([ -n "$SELECTOR" ] && echo "-S $SELECTOR") \
        $([ -n "$PRIVATE_KEY" ] && echo "-s $PRIVATE_KEY") \
        $([ -n "$CANON" ] && echo "-c $CANON") \
        $([ -n "$USER" ] && echo "-u $USER") \
        $([ -n "$HEADER_IGNORE" ] && echo "-o $HEADER_IGNORE") \
        -p $SOCKET
    echo $cmd
    echo

    # Start daemon
    echo  "Starting $prog: [OK]"
    [ -e $SOCKET ] && rm -f $SOCKET
    return $RETVAL
}

stop() {
    # Stop daemon
    echo -n "Shutting down $prog: [OK]"
    killall -9 $prog
    RETVAL=$?
    echo

    [ -e $SOCKET ] && rm -f $SOCKET

    # Stop daemon
    echo -n "Shutting down $prog: "
    killproc $prog
    echo
    [ -e $MX_SOCKET ] && rm -f $MX_SOCKET
}

# See how we were called.
case "$1" in
    start)
    start
    ;;
    stop)
    stop $2
    ;;
    restart)
    stop
    start
    RETVAL=$?
    ;;
    *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac

exit $RETVAL



以上都只是软体的准备动作,接下来我们要做的就是实际的签章部份了


3. 设定 DKIM 的 private/public key 及建立 DNS 资讯
DKIM 的 key 使用 rsa 加密,不需要经过 CA 认证,所以 key 值都是由自己建立的,而一般会建议 key 长度小于 1024,主要
是因为最后要把 public key 放到 DNS 资讯记录中,若 key 太长会造成 DNS 封包放不下,容易发生一些副作用,所以这是做
key 时要注意的地方 (一般 DNS query 称为 basic query, udp 最大只能 512 bytes, 若要超过 512 bytes, 则 DNS query
需转为 53/TCP,并设立模式为 truncate , 或是使用 EDNS0,让 DNS 的回应可以大于 512 个 bytes)

3.1 手动产生 key
手动建立 key:

复制程式
#private key
$>openssl genrsa -out rsa.private 1024
Generating RSA private key, 1024 bit long modulus
..................++++++
..................................................................++++++
e is 65537 (0x10001)

#publick key
$>openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
writing RSA key

#以上即可建立完成

安装 dk-filter 时,里面附了一个 gentxt.csh (在 dk-filter 目录里),可以直接使用它来产生 key 及 DNS Record 内容

复制程式
$>./gentxt.csh 2006 eai1.twnic.tw
2006._domainkey IN TXT "g=; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH/mYXWTmnFBrqjU8SQIJCXz+iO4H5JPRrg8zwmlKV0mgYpPCRthUVGa0hGyi6D+hNqvskd+0rCoLtpztoGexDRKnc OOd6VBy5OzKwupLXEoDa8tTc1g2CvdxVnt2r5Q8/3rbdf/3Uw17TugxdAidJD2Fb QIPo3hCbZ0izGE9OEQIDAQAB" ; ----- DomainKey 2006 for eai1.twnic.tw

# g= 表示 local-part (username 为任意,如果有 i= 时,要对应这个 g= 为 i= 的 local-part, 好像有看没有懂,主要
# 是因为参数太多了,建议若有心人可以多看看 DKIM 的文件才能懂)

# k=rsa 表示 key 的演算法,这里为固定用法
# t=y 表示测试 (其他参数讲了只会让大家困扰,怒我就不写了,请参考 DKIM Draft)

此时 gentxt.csh 会在目录下建立 2006.private 及 2006.public,而输出的是你要放在 DNS 中的资料,所以需要在 DNS 建
立这个 DomainKey 的资料

复制程式
#named.conf
zone "twnic.tw" { type master;file "twnic";};

# file "twnic"
$TTL 3600
@ IN SOA ...略
; 其他 RR 略

$ORIGIN _domainkey.eai1.twnic.tw.
       IN       TXT        "g=; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH/mYXWTmnFBrqjU8SQIJCXz+iO4H5JPRrg8zwmlKV0mgYpPCRthUVGa0hGyi6D+hNqvskd+0rCoLtpztoGexDRKnc OOd6VBy5OzKwupLXEoDa8tTc1g2CvdxVnt2r5Q8/3rbdf/3Uw17TugxdAidJD2Fb QIPo3hCbZ0izGE9OEQIDAQAB" ; ----- DomainKey 2006 for eai1.twnic.tw
2006       IN       TXT       "g=; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH/mYXWTmnFBrqjU8SQIJCXz+iO4H5JPRrg8zwmlKV0mgYpPCRthUVGa0hGyi6D+hNqvskd+0rCoLtpztoGexDRKnc OOd6VBy5OzKwupLXEoDa8tTc1g2CvdxVnt2r5Q8/3rbdf/3Uw17TugxdAidJD2Fb QIPo3hCbZ0izGE9OEQIDAQAB" ; ----- DomainKey 2006 for eai1.twnic.tw
2007       IN       TXT       "g=; k=rsa; t=y; p=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ; 2007

2006,2007 是 Selector,是指在做 DKIM DNS query 时要前置的名称,用什么名称都可以,我的用意是在表示 2006 年我用这个
key, 2007 年我另一个 key,这里面并没有什么强制规定,只要你的 Mail Header ,DKIM中标示 s=XXXX,d=DOMAIN , 那收信对
方就会看这个 s=XXXX 做 XXXX._domainkey.DOMAIN 的 type=TXT 查询,如以本例即为


复制程式
# 查询 2006._domainkey.eai1.twnic.tw 的 TXT Record
[root@eai1 dk-filter]# dig 2006._domainkey.eai1.twnic.tw txt

; <<>> DiG 9.3.0 <<>> 2006._domainkey.eai1.twnic.tw txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52003
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;2006._domainkey.eai1.twnic.tw. IN      TXT

;; ANSWER SECTION:
2006._domainkey.eai1.twnic.tw. 60 IN    TXT     "g=\; k=rsa\; t=y\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDu1KF+c7ucCeilrmo1FH1nDEpt7DT4J4y71iGgKtpGfOo3/dEtLyw5t75VUKKwkAmmvUBVZACciqj/aZoujVXKnSSK4DDhbpLcRA3wABczUNCXe12izP6brTDxrfkg1yi+b+rwsqyAWkiMR32f6/9i/5o9chRl3uWyDoMIWHqY6QIDAQAB"

;; AUTHORITY SECTION:
twnic.tw.               86400   IN      NS      twnic.net.tw.

;; ADDITIONAL SECTION:
twnic.net.tw.           86400   IN      A       211.72.210.250

;; Query time: 3 msec
;; SERVER: 211.72.210.250#53(211.72.210.250)
;; WHEN: Thu Jul 20 10:39:16 2006
;; MSG SIZE  rcvd: 334


所以不论您以手动建立 KEY,并存入 DNS Record 中 (如上例),或使用 dk-filter 附的 gentxt.csh 产生 key 并抄至
DNS 中,其实都是一样的,而后记得将 private key 保存好 (通常我都放到 /etc/mail 中),我用年区分主要用意在于强
迫自己每年要换一次 KEY

以上,我们做了 Sendmail MILTER 支援与否的确认,并且安装了 dk-filter,产生了 private/public key,并建立了
对应的 DNS 资料,这些动作都是分开的,您那一个先做后做都没有关系,上述的说明您可依章节独立来看也可以,因为
我们尚未为 sendmail 和 dk-filter 建立沟通方式(socket),所以是没有关系的


4. 修改 sendmail.mc 及测试

4.1 修改 sendmail.mc
要让 Sendmail 能加入 DKIM 检查需在 sendmail.mc 中加入必要资讯

复制程式
#在 sendmail.mc 的 Mailer 之前加入

dnl # 前略
dnl # 让 MILTER 的 log 能出到最详细资料,初学时要注意,资讯多一点有利于您的判读,若熟悉了可以拿掉或调回到4以下
define(`confMILTER_LOG_LEVEL',`99')

dnl # 让 Sendmail Log 到 15 以上,可以看见详细的邮件沟通过程,但 maillog 会长很快
define(`confLOG_LEVEL',`15')

dnl # 加入 dk-filter ,进行 DKIM 的 sign/verify 动作 (mode=s,v,sv)
INPUT_MAIL_FILTER(`dkim-filter', `S=inet:8891@localhost')

dnl # 后略


4.2 启动 dk-filter 及 sendmail
做好修改 sendmail.mc 动作好重新产生 sendmail.cf,并先确认 dk-filter 巳执行中,重新启动 sendmail,
(切记, dk-filter 要先执行,才跑 sendmail,而后 dk-filter 有重启都没有关系)

复制程式
$>m4 sendmail.mc > sendmail.cf
$>/etc/rc.d/init.d/dk-filter start
$>(确认 dk-filter 巳执行中)
$>service sendmail restart

如此即完成了 sendmail DKIM 的功能,而初步完成后建议您先进行测试,以了解 sign 的功能是否正常

4.3 发信测试,Local Mail
试发一封寄给自己的信,确认其内容是否有 DKIM 讯息

复制程式
$>echo "" | mail abelyang -s "DKIM testing"
$>mail -u abelyang
看到的信件内容
From root@eai1.twnic.tw  Thu Jul 20 11:16:05 2006
X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on eai1.twnic.tw
X-Spam-Level:
X-Spam-Status: No, score=0.0 required=5.0 tests=DK_POLICY_SIGNSOME,
        DK_POLICY_TESTING,DK_SIGNED,SPF_HELO_PASS,SPF_PASS autolearn=failed
        version=3.1.3
X-DomainKeys: Sendmail DomainKeys Filter v0.4.1 eai1.twnic.tw k6K3G5FJ011141
DomainKey-Signature: a=rsa-sha1; s=2006; d=eai1.twnic.tw; c=simple; q=dns;
        h=received:from;
        b=rt7TfR5smobv7WnmQjddlRYWUNKCoIVwbUQZ9nek0xMOFlRqbXWMU9Es65ljpN1Yz
        gMk9izKfxbMCkE8YE4BDmEczrWJ7bLKAHkXBS5gulx/l3t+cNBiP3KbQtAJ8LjJVTCe
        kMEmp8+FVUkobhVVTxlJya9AkgEN2Cdnsc1WYhg=
Date: Thu, 20 Jul 2006 11:16:05 +0800
From: root <root@eai1.twnic.tw>
To: abelyang@eai1.twnic.tw
Subject: DKIM testing

看起来无误,这其中的 X- 分别是 spamassassin 及 dk-filter 所加的,而个人测试主机之 spamassassin 有启动 DKIM 及 SPF 的检
查,所以 X-Spam-Status 中会有相关的资讯,但这个不是个人的重点

重点是这个 Header

复制程式
DomainKey-Signature: a=rsa-sha1; s=2006; d=eai1.twnic.tw; c=simple; q=dns;
        h=received:from;
        b=rt7TfR5smobv7WnmQjddlRYWUNKCoIVwbUQZ9nek0xMOFlRqbXWMU9Es65ljpN1Yz
        gMk9izKfxbMCkE8YE4BDmEczrWJ7bLKAHkXBS5gulx/l3t+cNBiP3KbQtAJ8LjJVTCe
        kMEmp8+FVUkobhVVTxlJya9AkgEN2Cdnsc1WYhg=
a= 表示加密方式
s= 为 selector
d= 为 Domain
c= 为 canon 方式,预设为 simple
q= 为 query 方式,目前只有 dns
h= 为以那些 Header 做签证动作,因为我去掉了 (-o) 一些,所以 h= 那些
b= 签证后的值,这个值为 base64

因为是自己发给自己(127.0.0.1),所以不会有 verify 的动作,我们现在用 telnet 来测试一下

复制程式
[root@eai1 dk-filter]# telnet eai1.twnic.tw 25
Trying 211.72.210.249...
Connected to eai1.twnic.tw.
Escape character is '^]'.
220 eai1.twnic.tw ESMTP Sendmail 8.13.6/8.13.6; Thu, 20 Jul 2006 11:24:38 +0800
ehlo eai1.twnic.tw
250-eai1.twnic.tw Hello eai1.twnic.tw [211.72.210.249], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH CRAM-MD5 LOGIN PLAIN
250-DELIVERBY
250 HELP
mail from: <abelyang@eai1.twnic.tw>
250 2.1.0 <abelyang@eai1.twnic.tw>... Sender ok
rcpt to: <abelyang@eai1.twnic.tw>
250 2.1.5 <abelyang@eai1.twnic.tw>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
Date: Thu, 20 Jul 2006 11:16:05 +0800
From: root <root@eai1.twnic.tw>
To: abelyang@eai1.twnic.tw
Subject: DKIM testing

.
554 5.7.1 Command rejected

因为此时我们用的 IP 为 211.72.210.249,所以对于来信没有 DKIM (nosig), 我们设定了 no=r, 所以信件就不收,即会
出现这样的讯息. 依 DKIM 的 Draft 的愿景,首重先推广 DKIM,待 DKIM 有一定程度的普及后才会到 reject 的可能,但
我的用意在做说明,所以本文用的是没有 sign 就 reject, 当然您可以不用 -C 参数,就不会有这样的情况发生了


4.4 发信测试,外部
Yahoo 的 mail 目前有 DKIM,所以是我们最佳的测试目标,我们可以试发 Mail 到 yahoo.com.tw 上的帐号上进行测试,这
个测试主要在于了解自己的 DKIM 是否设定正确
yahoo mail 结果


由以上可知,这样的过程是 OK 的, Yahoo 对我的来信进行了 Verify, 并且确认了这个信件是来自于我的 Domain,
若反向而为,从 Yahoo 向我的 Mail Server 发信,可以发信,但是 Yahoo 的 mail 发向我的信会有问题,这个问题在 maillog
会出现:

复制程式
Jul 21 16:52:25 eai1 sendmail[15482]: k6L8qPC4015482: milter_read(dkim-filter): cmd read returned 0, expecting 5
Jul 21 16:52:25 eai1 sendmail[15482]: k6L8qPC4015482: Milter (dkim-filter): to error state

这是 dk-filter 目前的 bug, 至预计下一版才会进行修正,不过目前巳有 0.5.1 版且此版本较能 follow DKIM draft, 但显然
Yahoo 的 DKIM 只能配合到原来的 Draft-03 (意即 dkim 0.4.1 版),所以本处的介绍即以 0.4.1 版为主,而 0.5.1 版的使用
仅是大同小异(参数略有不同),而我们在使用 DKIM 发信给 Yahoo 时,使用 0.4.1 版 Yahoo 能够正确的辨认我们的 Key 对不
对,而使用 0.5.1 因为一些栏位 Yahoo 看不懂,所以它就会认为我们送的信没有 key (nosig),反而造成它无法认为我们使用
DKIM.



5. 结语
即使 DKIM 立意虽不错,但是仍不能预防 SPAM,因为 SPAMER 可以 follow 标准(Draft),而 verify 一样会 pass,所以个人并不
期待它能有多大的效果,但是 DKIM 对于信确实由这个网域名称所发出的检查是能正确验证的,而对于我所使用的 DKIM 所发出来
的信件,它仍归类为垃圾邮件 (我有反解,且正反解一致,也有 DKIM),所以可以知道的是它不是仅以反解或 DKIM 来判断
一封邮件是否为 Spam,也和邮件内容的长短无关,而可能是其他因素所致.

参考:
1. http://www.atmarkit.co.jp/fsecurity...nkeys/dk04.html
2. http://www.erikberg.com...ters.html
3. http://www.elandsys.com/reso...il/dkim.html

附录1, dk-filter 0.4.1 Header,DKIM Draft 02 版 Mail Header

复制程式
DomainKey-Signature:a=rsa-sha1; s=2006; d=eai1.twnic.tw; c=simple; q=dns; 
       h=received:from; 
       b=YM3a3E8rF5sQy+0Mb8K0G7bkQ8Nq3gPEfoY8nZtk9TOlHsiyFEYPtQbMXi50Eo9Wd
       TJ2Fa61BHNsUrm6PYH9En8MaRF1zI3HgLms6GELpChbF2bYjrAXqu9hhjWpxzUDZoI2
       DlG6rPSiC39bviTqDUDuCpAY+Ssw6LuNp6FyY5Q=


附录2, dkim-filter 0.5.1 Header , DKIM Draft 03 版 Mail Header

复制程式
DKIM-Signature:       a=rsa-sha1; c=relaxed/simple; d=eai1.twnic.tw; s=2006; t=1153707289; bh=sN3ES5nmlXy4I3QtCSbftYMZfrY=; 
       h=Received:Date:From:Message-Id:To:Subject; 
       b=kyZaJUnHKfUX0IyzjDRpvz/FrT0XQXLt08WhGf/s5L
       gSFqlrAgJAQ5jb5gsIqhLBLW5HZBJbGSf87RdUilKE8BvuphrERJikgYbPthuieK6ce
       oxlC9JGGrb9joKnZ/X3HYTLo1iUyveC6QsAQ4T1zGcnkPK8dTJ95hXeXnK87ZM=

# t= 表示 sign 的时间,而 bh= 表示 Body 的 sign 结果,c= 也进行了一些调整

转贴自 http://phorum.study-area....php/topic,40579.html



每天大笑三声,可以让你更长寿哦...^^
献花 x0 回到顶端 [楼 主] From:台湾新世纪资通股份有限公司 | Posted:2008-04-30 11:43 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.028490 second(s),query:15 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言