大家好,大家好
随着我们开始转向更安全的互联网(不仅仅是HTTP),我注意到越来越多的人开始询问有关安全邮件协议和如何测试的问题。
这篇教程就是关于这一点的,希望它能在未来有所帮助。
您将需要openssl和python,但如果您使用certbot,您应该已经安装了它们。
协议、定义
STARTTLS及其重要意义
使用OpenSSL-Gmail SMTP测试TLS连接
使用OpenSSL测试TLS连接-Gmail IMAP Gmail POP
如何与协议交谈-建立TLS连接后
协议示例-IMAP
测试脚本(Python)
电子邮件服务器的挑战(示例)
电子邮件客户端的挑战(示例)
进一步工作
安德烈,A部分--协议和定义
礼仪--很像一种语言。目前使用的3种主要协议是POP、IMAP和SMTP。可以在这里找到比较:http://www.contactgenie.info/understanding-email-protocols-pop-imap-mapi-eas/.我们将重点关注IMAP、POP和SMTP,因为它们很容易找到和使用。MAPI和其他一些是特定于供应商的,需要Exchange/兼容服务器进行测试。
传输--我们如何与服务器连接和通信。与具有安全和非安全邮件的HTTP不同,邮件协议有第三种选择。下面是我们可以与邮件服务器通信的3种方式的定义(使用上述任何一种协议)
A)隐式安全--如HTTPS--所有通信从一开始就加密
B)显性安全--最接近的比较将是重定向。在那里我们开始使用HTTP,然后服务器告诉我们转到HTTPS。(这是一个非常宽松的比较)
C)本质上不安全--HTTP
下面是一个很好的概述:
快速邮件帮助和支持
SSLVS TLS VS STARTTLS
对于不同的术语**SSL**、**TLS**和**STARTTLS**,人们经常会产生相当大的混淆。
其中一件事将吸引许多来自网络世界的人是STARTTLS的概念。
如果你习惯了在不安全的情况下确保安全,你可能会想,你能两者兼而有之吗?为什么你会这样做。上面的快速邮件链接解释了这两种情况,所以我不会担心这个理论。
我们来做些测试吧。
查看一下Googles SMTP服务,我们可以看到端口25是打开的。我们知道谷歌在安全方面做得很好,所以我们可以假设他们不会让人们使用不安全的协议进行连接。
然而,情况似乎并非如此。因为我们有一个会议,我们可以在里面打字。
现在,让我们看看当我们尝试使用auth登录命令时会发生什么(SMTP如何登录)
错误消息指出我们需要首先运行STARTTLS命令(我们确实这样做了)
过了一段时间,你就会断线了。
关键要点-虽然我们可以不安全地连接,但在我们告诉服务器开始使用安全连接之前,我们可以做的事情是有限的。
现在,让我们使用openssl和STARTTLS命令执行相同的操作。
命令:
Openssl S_客户端-连接smtp.gmail.com:25-STARTTLS SMTP
我们现在得到一个提示,我们可以在其中键入相同的命令
图像852×412 15 KB
不要太担心各种命令的含义,因为它们是特定于协议的。(我们将在稍后介绍这些内容)。
如果我们看一看Wireshark对此交易的捕获,我们将看到以下内容。
图像1355x372 35.9 KB
我们开始讨论不安全的SMTP协议,然后升级到安全的TLS1.2协议。这就是STARTTLS命令的工作方式,使用OpenSSL-Gmail SMTP测试TLS连通性
注意:目前,只要我们得到一个命令提示符,我们就认为连接已经通过(我们没有进行任何协议测试。我们只是在检查交通工具)
端口465被指定为STMPS或基于SSL的SMTP,我们应该能够在没有STARTTLS协商的情况下进行连接。
Openssl S_客户端-连接smtp.gmail.com:465.
图像769×358 22.5 KB
如果我们尝试以相同的方式连接到端口587,似乎会收到错误
Openssl S_客户端-连接smtp.gmail.com:587
图像824×438 16.2KB
这是因为没有侦听任何SSL握手消息,并且握手未完成
如果我们添加-STARTTLS SMTP命令,我们将能够连接,因为初始不安全对话将启动TLS会话(如端口25)
Openssl S_客户端-连接smtp.gmail.com:587-STARTTLS SMTP
Image800×372 7.46 KB,使用OpenSSL测试TLS连接-Gmail IMAP Gmail POP
大多数提供商,如Gmail,Yahoo,Zoho只提供隐式安全的POP和IMAP界面。
测试这些端口很容易,因为我们所要做的就是指定正确的端口。
命令:
Openssl S_客户端-连接imap.gmail.com:993
Openssl S_客户端-连接op.gmail.com:995
注意:目前,只要我们得到一个命令提示符,我们就认为连接已经通过(我们没有进行任何协议测试。我们只是在检查交通工具)
屏幕截图还显示了错误的主机,如何在建立TLS连接后与协议交谈
从TLS测试中,只要我们得到提示,我们就认为TLS工作正常。
但是,我们可以更进一步,测试我们是否获得了良好的通信(即服务器正在响应)。
要做到这一点,我们应该知道协议期望的命令的语法。
幸运的是,这些都在下面的链接中列出
Imap命令参考:http://busylog.net/telnet-imap-commands-note/,协议示例-imap
使用上面的引用,我们应该能够在Gmail服务器上测试IMAP命令。
让我们通过运行以下命令再次建立连接
Openssl S_客户端-连接imap.gmail.com:993
A1登录changeme@gmail.com changeme
A1能力
图像726×226 17 KB
图像969×227 5.77 KB
如果您参考上面有关IMAP的参考资料,将在那里向您解释这些命令。
因为我很懒,语法是我最大的弱点,所以我写脚本,所以我不需要记住东西。
让我们运行与上面相同的3个测试,看看脚本告诉我们什么
端口25上的SMTP Gmail:
Image.png962×240 13.9KB
第一条消息是来自服务器的横幅
第二条消息是STARTTLS命令的响应(并非所有服务器都有相同的响应)
第三个是返回的对等证书(这是为了测试自签名证书)
第四个是证书中的域(检查主机名错误等)
第五个是密码套件(这样我们就可以看到服务器选择了什么密码)
接下来的部分是尝试使用协议定义的方法登录。注意:每个协议都不同,这就是打印出编码字符串等的原因。
另请注意:该脚本使用changeme@gmail.com和changeme作为默认设置。如果您想使用它,请更改这些内容,但不要发布最后一位的输出
端口995上的POP Gmail:
Image.png961×148 7.01 KB
端口993上的IMAP Gmail
Image.png958×134 5.99 KB
正如您所看到的,这些协议的身份验证方式非常不同,但是证书和握手是相同的。
我已经更新了代码,以包括连接信息、电子邮件服务器的挑战(示例)
我这样编写测试脚本的原因之一是帮助人们隔离服务器与协议或传输之间的挑战。
案例一:谷歌和不安全的应用程序
提供了有效的凭据。
示例2:雅虎不再响应服务,但端口是开放的,电子邮件客户端的挑战(示例)
客户端并不总是清楚地表明它们是否支持STARTTLS,或者只是隐式地安全连接。
令人困惑的例子:PHPMAILER:
机会主义加密--这是什么?
GitHub
PHPMailer/PHPMailer
经典的PHP电子邮件发送库。通过在GitHub上创建帐户,为PHPMailer/PHPMailer开发做出贡献。
令人困惑的例子:Zoho Mail
然而,他们的意思是STARTTLS,因为大多数人使用TLS和SSL的方式相同,我可以看出人们是如何感到困惑的
Image.png902×497 27.9 KB
一个很好的例子:Python SMTPLIB:
清楚地描述了如何使用STARTTLS以及不支持哪些方法
图像.png1135×181 23.2KB
Image.png1109×191 14.3 KB
一个很好的例子:Gmail
STARTTLS是明确识别的。
Image.png811×409 22.9 KB,进一步工作
我希望你已经读了这篇文章,并学到了一些东西。
我认为我们应该更好地描述Secure Mail协议以及它们是如何工作的(因此这一点)
我计划完成测试脚本并将其集成到Web服务中,以便帮助人们测试一系列协议和运输方法。
写这篇文章花了一些精力,回顾过去,我明白人们是如何感到困惑的(大量标准和令人困惑的术语)
我希望这在某种程度上有助于您的安全邮件计划
安德烈,好主意-干得好!
thx很多,很棒的帖子!我能够测试我的Google服务器并查看他们的CA。
谢谢!
E\