OpenSSL是一款开源工具包,用于实现安全套接层(SSL)和传输层安全(TLS)协议,它对于大多数负责安全网络工作的Linux管理员来说是必不可少的一款日常工具。但是OpenSSL还包括丰富的功能,连经验老到的资深人士也可能不太熟悉这些功能。你可以使用OpenSSL来测试POP和IMAP服务器,并且测试服务器的连接速度,还有其他值得关注的用途。
OpenSSL测试POP和IMAP服务器当你部署一台新的邮件服务器,或者对旧的邮件服务器进行更改时,传统的telnet仍是测试未加密的POP和IMAP服务器会话的保留工具。但是如果是使用TLS/SSL加密的服务器,该怎么办呢?Telnet无法与这些服务器进行对话。要测试这些服务器,最快速、最容易的办法就是使用OpenSSL的s_client选项。s_client是一个普通的SSL/TLS客户端,用来测试使用TLS/SSL的所有服务器。
要测试POP服务器,先给自己发送一堆测试消息,那样你就有东西可以处理了。使用域名或IP地址和端口号,连接到POP3S服务器;端口995是标准的POP3S端口:
$ openssl s_client -connect mailserver.com:995你会看到好多信息一闪而过,最后会出现这样的内容:
Verify return code: 18 (self signed certificate)---
+OK Hello there.
这个响应表明这是一台Courier POP3服务器。另一种流行的POP3服务器Dovecot会有这样的响应:
Verify return code: 18 (self signed certificate)---
+OK Dovecot ready.
我想,大概Courier很害羞,不想表明身份。每一种响应都确认了服务器在运行,在响应客户端请求;核实了TSL/SSL加密处于正常工作状态。如果你想了解更多的详细信息,可以用tee命令把相当冗长的输出结果记下来,以便进一步分析。该命令将命令结果导到文本文件上,同时将它显示在屏幕上:
$ openssl s_client -connect mailserver.com:995 | tee pop3s.txt如果输出内容看起来正确,也没有报告你的SSL证书有何问题,那么服务器极可能处于良好的工作状态,准备投入运行。要不然,你可能会看到这个常见的错误消息:
Verify return code: 20 (unable to get local issuer certificate)这意味着,OpenSSL找不到你存储的可信证书管理机构(CA)。安装的每一个Linux系统都默认存储了Verisign、Thawte和Comodo等各大商业CA的证书,以及你在上网冲浪或使用电子邮件时添加的任何CA。(比如当你访问网站时,Firefox弹出一些警示内容,表明该网站在使用不可信的CA,提示你是否果真确信要访问该网站?你是否想要添加例外。)你可以告诉s_client你的邮件服务器的CA在哪里:
$ openssl s_client -connect mailserver.com:995 -CApath /etc/ssl/certs/然后,它应该会显示Verify return code: 0 (ok).
现在,你可以收阅电子邮件,看看测试邮件有没有送达。输入下面的粗体命令,使用你自己的登录信息。非粗体的几行是服务器响应:
$ +OK Dovecot readyuser carla
+OK
pass password
+OK Logged in.
stat
+OK 2 4761
list
+OK
1 2232
2 2531
.
retr 1
+OK 2232 octets
Return-path:<admin@test.net>
[...]
stat告诉你收件箱里面有多少封邮件及邮件大小。list列出了你的邮件。retr检索邮件,并按照列表号来显示,显示了所有标题,然后是邮件正文。你完成后,只需输入quit。
测试IMAP服务器测试IMAP服务器需要使用一套不同的命令。粗体的行同样是你输入的命令。为了简洁起见,我只摘了服务器输出的一部分:
$ openssl s_client -connect mailserver.com:993[...]
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
. login carla password
. OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE [...] LIST-STATUS QUOTA] Logged in
. list "" "*"
LIST (\HasChildren) "." "INBOX"
* LIST (\HasNoChildren) "." "INBOX.work"
* LIST (\HasNoChildren) "." "INBOX.personal"
* LIST (\HasNoChildren) "." "INBOX.Trash"
. examine INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft Junk NonJunk $Forwarded)
* OK [PERMANENTFLAGS ()] Read-only mailbox.
* 1 EXISTS
* 1 RECENT
* OK [UNSEEN 1] First unseen.
[...]
. OK [READ-ONLY] Select completed.
. fetch 1 rfc822.text
* 1 FETCH (RFC822.TEXT {9}
test message, do not read. Kthx.
)
. OK Fetch completed.
logout结束会话。list "" "*"命令列出了你的所有邮箱,而examine INBOX意味着列出收件箱里面的邮件。fetch 1 rfc822.text只显示邮件文本,不显示标题。要注意开头的点;这是个命令标记,必须要有。标记可以是任何字符或字符组合,不得有空格,而且必须放在你输入的每个命令前面。IMAP 会用你选择的命令标记给其回复作上标记,不过不知什么原因,它把点换成了星号。如果你使用数字或字母,它就会使用那些数字或字母;你可以试用不同的标记,就很容易看到。IMAP允许多个连接,所以标记告诉你命令和响应属于哪一个连接。
RFC 1939详细描述了所有POP3命令和会话中的正确步骤,RFC 3501则详细描述了IMAP4。
测试远程连接速度OpenSSL随带一个内置的基准测试套件,该套件含有连接测试速度:
$ openssl s_time -cipher DHE-RSA-AES256-SHA -connect mailserver.com:993