Courier IMAP配置中适配MySQL SHA256加密密码的正确AUTH能力项咨询
首先得明确问题的核心:你遇到的问题不是单纯添加AUTH=CRAM-SHA256就能解决的——CRAM系列认证是挑战响应式的,它需要Courier能获取到用户密码的原始值(或者等价密钥)来计算HMAC哈希,而你现在存在MySQL里的是密码的SHA256哈希,这是单向不可逆的,Courier没法用它完成CRAM认证流程。
下面给你两种可行的解决方案,你可以根据需求选择:
方案一:调整密码存储格式,适配Courier的SHA256认证
Courier支持直接识别带特定前缀的哈希值,我们可以修改MySQL的用户插入语句,给SHA256哈希加上{SHA256}前缀,再配置Courier认证模块识别这种格式:
重新存储用户密码
用以下SQL语句插入或更新用户(替换成你的实际信息):INSERT INTO `users` (`id`, `name`, `maildir`, `crypt`) VALUES ('postbox@domain.com', 'Mr. Postbox', 'domain.com/postbox/', CONCAT('{SHA256}', SHA2('loginpwd', 256)));配置Courier的MySQL认证模块
编辑/etc/courier/authmysqlrc文件,确保以下配置项正确(替换成你的数据库信息):MYSQL_SERVER localhost MYSQL_USERNAME 你的数据库用户名 MYSQL_PASSWORD 你的数据库密码 MYSQL_DATABASE 你的数据库名 MYSQL_USER_TABLE users MYSQL_LOGIN_FIELD id MYSQL_CRYPT_PWFIELD crypt MYSQL_CRYPT_SCHEME sha256调整IMAP的AUTH能力项
保留你添加的AUTH=CRAM-SHA256,同时建议加上AUTH=PLAIN(配合TLS使用更安全),修改/etc/courier/imapd中的配置:IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 AUTH=PLAIN IDLE"重启Courier服务生效
sudo systemctl restart courier-imap courier-authlib
方案二:使用PLAIN认证(配合TLS加密)
如果你不想修改密码存储格式,也可以直接使用PLAIN认证,但必须确保IMAP连接通过TLS加密(避免明文传输密码):
确保Courier的IMAP TLS配置正常
检查/etc/courier/imapd-ssl文件,确认TLS相关配置(比如证书路径)正确,且服务正常运行。调整IMAP的AUTH能力项
在/etc/courier/imapd中确保包含AUTH=PLAIN:IMAP_CAPABILITY_ORIG="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 AUTH=CRAM-SHA256 AUTH=PLAIN IDLE"修改authmysqlrc支持明文验证
因为你存储的是SHA256哈希,需要让Courier用提交的明文密码计算SHA256后和数据库中的值对比,修改/etc/courier/authmysqlrc的配置和方案一一致即可。重启服务
执行相同的重启命令让配置生效。
为什么之前的AUTH=CRAM-SHA256不工作?
再强调一下:CRAM-SHA256认证需要Courier用用户的原始密码生成HMAC-SHA256响应,而你存储的是密码的SHA256哈希——这是单向加密的,无法反向得到原始密码,所以Courier无法完成CRAM的挑战响应流程,自然认证失败。
备注:内容来源于stack exchange,提问作者Andrés Chandía

