qmail-smtp增加smtp-auth认证
2011-01-09    刘世伟   
打印自: 安恒公司
地址: HTTP://analyzeair.anheng.com.cn/news/article.php?articleid=2311
qmail-smtp增加smtp-auth认证
邮件系统 qmail+vpopmail+mysql帐号管理

vpopmail的vchkpw程序, 用来实现smtp的帐号认证, smtp认证一般有3种方式, PLAIN,login,CRAM-MD5,
其中CRAM-MD5的实现, 其实就是传递md5值进行认证, 而在服务器端, 需要知道真实的密码,来运算md5值, 也就是说数据库的pw_clear_passwd字段, 必需是真实的原始密码.
如果是用php程序管理这些数据库帐号, 就一定要把真实密码放进来, 否则CRAM-MD5的模式就不能执行.


在vpopmail的configure参数中, 如果 --enable-logging=v, 就会显示大量的log, 包括认证密码什么的都会显示出来,不妨用这个来查找问题,
另外,还可以在.c中 , 增加syslog,把需要的调试信息,输出到syslog中,方法:
增加一个 #include  <syslog.h>
然后直接使用syslog(0,"[con=%s,pass=%s]",con,password);
在生产环境, 上面的调试功能一定要关闭.


另外 vchkpw中关于cram-md5的认证过程,有2个参数,搞反了, 需要调整过来,
retrieving revision 1.1
diff -u -r1.1 vchkpw.c
--- vchkpw.c    9 Jun 2011 17:01:15 -0000       1.1
+++ vchkpw.c    9 Jun 2011 17:04:32 -0000
@@ -744,7 +744,7 @@
    unsigned char h;
    int j;

-   hmac_md5( challenge, strlen(challenge), password, strlen(password), digest);
+   hmac_md5( (unsigned char *) response, strlen(response), (unsigned char *) password, strlen(password), digest);

    digascii[32]=0;

@@ -756,7 +756,7 @@
      digascii[(2*j)+1]=hextab[h];
    }
    /* printf("digascii: %s, response: %s", digascii, response); */
-   return(strcmp(digascii,response));
+   return(strcmp(digascii,challenge));
 }
 



ucspi-ssl提供一个外壳, 调用qmail-smtpd or  qmail-pop3,对网络流量进行ssl加密,
ucspi-ssl-0.70有个bug会造成sslserver崩溃segfault, 在dmesg里面可以看到,根据符号,是因为str_len访问了非法地址.
最后找到ucspi-ssl-0.70.2的版本,升级后解决问题.

--- to be continue --
责任编辑: admin