大多数有网络意识的程序都应该使用密码术保护数据,以免数据被偷窥,但许多程序都没有这样做,可能是因为程序本身是旧应用程序,或者因为安全套接字层(Secure SocketsLayer,SSL)很难加入到应用程序中。Stunnel 是一种程序,使程序员和系统管理员可以很轻松地对任意 TCP 会话加密。您可以很轻松地在客户机和服务器上启用 SSL — 而且这样做不会影响程序源代码。
SSL 挑战 在大多数开发环境中,并不是在产品的整个生命周期中都考虑安全性而是在出现安全性问题后才采取补救措施。从传统的观点来看,这是坏事 — 事后亡羊补牢很困难,就象向一个写得马马虎虎的软件添加一个可靠性模块来除去错误一样困难。
象这些亡羊补牢技术从安全性立场来看好像是可行的,但实际上不太可靠。例如,您可以写一段代码,建立网络连接,然后连接到一个库 — 该库用执行加密和认证的版本代替所有的传统网络调用。
实际上,这种集成的容易性是安全套接字层,或称为 SSL(用于 secure HTTP 连接的协议)的最初目的之一。SSL 的几种实现已经在试图顺便替代标准 Berkeley UNIX socket API,或者带有尽可能相似接口的库。
OpenSSL 库(请参阅参考资料)是尝试后一种方法的一个很好的示例。在 OpenSSL 库中,相似的 API 模仿传统的套接字调用,使用 SSL 上下文对象代替文件描述符。例如,传统的写入套接字的调用具有以下特征:
/* Returns the number of characters successfullywritten */
size_t write(int file_descriptor, void *buf, size_t len)
OpenSSL 更改每个参数的类型,但每个参数的语义不变:
/* Returns the number of characters successfullywritten */
int SSL_write(SSL *socket_info, char *buf, int len)
实际上,除 SSL 对象之外,其它所有的类型与初始调用都是兼容的。理想情况下,开发者能够对程序进行较小的修改,只需添加一些代码从文件描述符初始化 SSL 上下文即可。
而事实上,SSL 库都不容易使用。例如,开发者要写许多附加代码才能使 OpenSSL 在多线程环境下工作。实际上,为将这个库集成到代码中去,大多数开发组织花费的精力都比他们预计的要多的多,而结果还常常是一片混乱。
Stunnel 幸运的是,有一种方法可以将加密功能无缝添加到网络连接中,而不会将您原来的代码段基址搞乱。Stunnel 是一个程序,可以使用 OpenSSL 库对任意 TCP 会话进行加密。它作为服务器运行在程序外部。Stunnel 服务器主要执行两个功能:一,首先,接收未加密的数据流,进行 SSL 加密,然后将其通过网络发送;二,对已进行 SSL 加密的数据流进行解密,并将其通过网络发送给另一个程序(该程序通常驻留在同一机器上,以避免本地网络上的窥探攻击)。