Linux管理员必用OpenSSL服务器测试技巧

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 ready

user carla

+OK

pass password

+OK Logged in.

stat

+OK 2 4761

list

+OK

1 2232

2 2531

.

retr 1

+OK 2232 octets

Return-path:

[…]

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

我拷贝了来自s_client会话的密文列表,服务器在其中告诉你它支持哪些密文。你还可以不用指定任何密文,就运行测试。OpenSSL会提出抱怨,但还是会运行测试。当你不指定密文时,运行起来速度通常比较慢,所以如果你的邮件客户端让你可以选择使用哪个密文,你可能会看到运行速度比较快。

你可以在任何服务器上使用这个命令,比如能够支持HTTPS的Web服务器:

$ openssl s_time -connect webserver.com:443

OpenSSL参考手册页不是很详细或很有帮助。要获得更多的信息,一个办法就是故意以错的方式运行命令,比如openssl s_time foo.OpenSSL在作出响应时会提供选项摘要。如果你更喜欢阅读出色的入门书,Joshua Davies所着的《使用密码和PKI实现SSL/TLS》(Implementing SSL / TLS Using Cryptography and PKI)是这方面的经典图书之一,而且该书内容很新。如果你不想花钱,可以下载OpenSSL源代码,研读与源代码捆绑的说明文档。

最后,为了供你参考备用,下面列出了Web服务器和邮件服务器的标准端口;当然,任何Linux系统上的/etc/services都含有完整的列表。

-smtp 25/tcp

-http 80/tcp

-pop3 110/tcp/udp

-imap4 143/tcp/udp

-https 443/tcp/udp

-ssmtp 465/tcp

-imaps 993/tcp/udp

-pop3s 995/tcp/udp