使用OpenSSL测试应用程序技巧
OpenSSL是Linux管理员应对网络数据传输安全的利器。它实现了SSL(Secure Socket Layer(安全套接层协议))协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。同时,也实现了TLSv1.0,TLS是SSLv3的标准化版。当然,OpenSSL的功用不仅仅在数据传输方面。我们可以利用它测试应用程序、程序连接服务器的速度等等。本文中笔者为大家介绍如何使用OpenSSL测试邮件收发(POP、IMAP)服务器。
OpenSSL测试POP3服务器
一般,我们架设好一台邮件服务器或者升级了邮件服务器应用程序后,都需要做一些测试工作,以保证服务器能够正常收发邮件。可以使用传统的telnet程序来测试收发明文邮件。但需要测试加密(TLS/SSL)邮件时,telnet就无能为力了。当然,聪明的你一定会想到使用OpenSSL来测试加密邮件了^_^。利用该软件的s_client选项可以轻松实现数据加密(TLS/SSL)传输测试。
测试收件服务时,我们需要知道提供POP3S服务的域名或IP地址以及服务端口,POP3S服务的标准端口时995。
$ openssl s_client -connect cnphp.info:995
连接时会出现一大堆信息,最后几行是:
Verify return code: 18 (self signed certificate)
—
+OK Hello there.
上面的信息反映出收件服务器使用的是courier-pop3程序。另一款较常用的邮件服务器是Dovecot。它的返回信息如下:
Verify return code: 18 (self signed certificate)
—
+OK Dovecot ready.
Courier服务器相当低调啊^_^。不了解的人,从返回信息中基本看不出是courier收发的邮件。当然,刚才一大堆的返回信息中有许多有用的内容;如服务器的运行状况、用户请求、是否支持TSL/SSL等,如果你对这些一闪而过的内容感兴趣,可以利用tee的管道命令输出到文本文件或直接显示在屏幕上。
$ openssl s_client -connect cnphp.info:995 | tee pop3s.txt
如果返回代码18,恭喜你,你的加密(SSL)收件服务器运行正常,可以实际工作了,如果返回20之类的错误代码,就需要检查一下了:
Verify return code: 20 (unable to get local issuer certificate)
错误代码20表示你的安全证书没有通过CA验证。Linux的安全证书只有通过的CA验证才能正常使用,常用的验证机构有Verisign, Thawte和Comodo。我们在浏览web页面时,也会有这种情况,出现“您的安全证书未验证”之类的提示信息。可以指定安全证书:
$ openssl s_client -connect mailserver.com:995 -CApath /etc/ssl/certs/
返回信息Verify return code: 0 (ok).
验证通过后,即可通过收件服务检查是否有新邮件送达。输入用户名和密码与服务器交互:
$ +OK Dovecot ready
user cnphp.info
+OK
pass password
+OK Logged in.
stat
+OK 2 4761
list
+OK
1 2232
2 2531
.
retr 1
+OK 2232 octets
Return-path:<admin@cnphp.info>
[...]
stat命令可以查看收件箱中邮件数量;list命令列表邮件;retr命令输出显示指定序号(list命令中的序号)的邮件头和邮件内容。使用quit命令退出收件服务器。
测试IMAP服务器
测试IMAP服务器的命令略有不同。下面加粗的行均为用户输入的命令:
$ openssl s_client -connect cnphp.info:993
[...]
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE AUTH=PLAIN AUTH=LOGIN] Dovecot ready.
. login cnphp.info 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命令退出IMAP服务器。list “” “*”命令列出所有邮箱,examine INBOX命令列出邮箱中的邮件。fetch 1 rfc822.text命令显示邮件内容。注意到命令前的点号没?这是命令标示,是必须地^_^。不过,不止可以使用点号,我们可以指定任意(没有空格的)字符或字符串做命令标示。由于,IMAP允许连接多个服务器,因此,这个命令标示可以帮你和IMAP服务器区分命令到底是发送到哪一个服务器。
如果你想了解关于POP3和IMAP4的更多内容,可以查看RFC 1939和RFC 3501这两个文档获取相关信息。
测试远程连接速度
OpenSSL 可以使用内置命令测试服务器远程连接速度等性能指标
$ openssl s_time -cipher DHE-RSA-AES256-SHA -connect www.cnphp.info:993
不止可以测试邮件服务器,其他类型的服务也适合,如网站的HTTPS服务:
$ openssl s_time -connect www.cnphp.info:443
OpenSSL的man手册中并没有给出本节中相关内容的具体说明。变通的方法是在执行如openssl s_time 命令是故意输错,程序会给出响应的提示信息^_^。
最后,为了方便各位测试自己的应用程序,给出常用服务名称和它们对应的端口:
- 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