• 【SMTP协议】关于SMTP AUTH命令导致鉴权


    问题

    自行实现了一个简易的SMTP邮件接受服务,用来接受告警邮件。但是今天在对接某些系统时出现了无法登陆的问题,抓包后发现的原因如下。

    S:
    250-AUTH LOGIN PLAIN
    250-SIZE 33554223
    250-8BITMIME
    250 HELP
    C:
    AUTH login 
    

    然后就导致鉴权错误,端口被关闭了。然后我又调查了一下正常发送邮件的逻辑:

    S:
    250-AUTH LOGIN PLAIN
    250-SIZE 33554223
    250-8BITMIME
    250 HELP
    C: AUTH login
    S: 334 VXNlcm5hbWU=
    C: 
    S: 334 UGFzc3dvcmQ=
    C: 
    S: 235 Authentication successful.
    

    可见发送失败的原因在于客户端在AUTH LOGIN命令中的后面追加了Base64编码的用户名,而我编写的服务并不支持这种发送格式,于是出现了问题。
    知道问题出在哪之后,解决的话其实也很简单。但是这种写法真的符合RFC规范吗?

    调查

    首先查看了Python的aiosmtpd类库,其中有一个issue就提到了这个问题。issue链接
    最后这个类库做了一次版本更新,支持了这种写法。

    但是查到了一篇文章,里面有提到这种写法。原文链接
    里面有一句:

    However, there exists a different, RFC compliant version of this behavior, where the client initially sends the userid already with the AUTH LOGIN method:
    C: AUTH LOGIN ZHVtbXk=
    S: 334 UGFzc3dvcmQ6
    C: Z2VoZWlt

    然而根据RFC 4954协议中,虽然表明了auth命令可以跟随内容,但是没有明确的说明可以携带用户名。原文链接

    由于RFC文档太长,我没有时间全看完,目前我也就调查到这里了,抛砖引玉,如果大家找到了相关的文献定义欢迎交流。

  • 相关阅读:
    找暑期实习还是学习准备秋招
    Netty selector的运行
    LinuxC/C++ 实现简单的TCP服务端
    nginx 配置反向代理
    有向图的强连通分量——学校网络
    [C# WPF] 如何给控件添加边框(Border)?
    Null check operator used on a null value
    数据结构:哈希表
    SPASS-聚类和判别分析
    StyleGAN:彻底改变生成对抗网络的艺术
  • 原文地址:https://blog.csdn.net/j326214730/article/details/127111065