Stunnel的设置和使用

Posted on September 21, 2010

0


Stunnel作为一个小巧的跨平台(Unix/Linux和Windows)的开源(GNU)项目,提供了以下2个主要功能:

  • 针对本身无法进行TLS或SSL通信的客户端及服务器,Stunnel可提供安全的加密连接(基于OpenSSL)。
  • 针对有访问限制的局域网,Stunnel提供加密的SSL连接解除防火墙和代理的限制直接和远端服务器理论上的任何网络服务连接。我们知道一般局域网都会开放443端口用于加密的HTTP连接,我们可以利用这点用Stunnel和远程端口443创建一个SSL连接,防火墙和代理会认为这个连接是正常的HTTPS连接而允许通过。

我的这篇文章将主要介绍第二种功能的设置和使用。

Stunnel的安装

Stunnel的Windows版本可以点此下载。我们需要把下载下来的Stunnel程序同时安装在服务器端和客户端。安装过程比较简单,一路Next就行。假设我们把Stunnel安装在默认路径C:\Program Files\stunnel\下。具体安装步骤见下:

 stunnel 4.34 Setup License Agreement_2010-09-21_14-12-12stunnel 4.34 Setup Installation Options_2010-09-21_14-12-21

stunnel 4.34 Setup Installation Folder_2010-09-21_14-12-26stunnel 4.34 Setup Completed_2010-09-21_14-12-29

访问控制以及安全证书的生成

Stunnel使用OpenSSL提供了基于安全证书的访问控制。遵循SSL协议,客户端和服务器端都可以要求对方提供安全证书用以验证对方是否可信。而在大多数应用中往往只有服务器端需要验证客户端的安全证书以确认连接者可以被信任,所以我的这篇文章主要讲解服务器端验证的设置。客户端验证的设置方法和步骤同服务器端相反,这里就不再叙述了。

决定了如何进行访问控制,下一个步骤我们需要一个安全证书,你可以选择以下几个方法得到安全证书:

  1. Stunnel安装程序自带的(C:\Program Files\stunnel\stunnel.pem)
  2. OpenSSL成生的安全证书
  3. 从CA处购买的安全证书

一般来说不推荐方法1,因为通用性的Stunnel安全证书不能提供任何安全保证因为人人都可以下载获得。而最安全的第3种方法需要花费不少银子,因此这里我们使用方法2:在不花钱的情况下得到最佳的安全性。Stunnel的Windows版本并没有提供OpenSSL程序,所以要生成安全证书需要通过以下途径。

1. 使用网页服务生成安全证书

用Stunnel提供的网页服务,输入所有相关信息然后Stunnel的服务器会生成所需的安全证书,具体见下图:

Stunnel.org - Windows Internet Explorer_2010-09-21_13-48-59

点击Generate stunnel.pem File按钮等待几秒钟系统会出现以下页面:

PEM Generator - Windows Internet Explorer_2010-09-21_13-59-12

拷贝所有文本框内的内容另存为stunnel.pem文件,这个就是你所需要的安全证书了。正如Stunnel网页上所说,这种方法并不安全,因为生成的证书是通过没有加密的通道传输的,任何人都可以从中窃取这个证书。

2. 使用Unix/Linux生成安全证书

第二种方法需要一台安装了OpenSSL的Unix或者Linux主机。运行以下命令生成安全证书:

openssl req -new -x509 -days 365 -nodes
            -out ${FILE_NAME}.pem -keyout ${FILE_NAME}.pem

${FILE_NAME}.pem是自定义生成的安全证书的名字,其他各个参数的意义如下:

  • -new:生成新的密匙
  • -x509:生成X509安全证书
  • -days 365:有效期1年
  • -nodes:不设置密码
  • -out:生成的文件名
  • -keyout:存放密匙的文件名

运行这个命令后需要回答以下问题,然后安全认证会自动存放在${FILE_NAME}.pem文件中。

VirtualBox_2010-09-21_15-17-30 在验证安全证书有效性时,Stunnel使用Hash值搜索证书,所以我们还需要运行以下2条命令得到这个证书的Hash值,然后重命名这个文件:

hash_name=`openssl x509 -hash -noout -in ${FILE_NAME}.pem `
mv ${FILE_NAME}.pem $hash_name.0

这样最终得到的安全证书就是XXXXXXXX.0,其中X代表16进制数字。以上2段脚本可以合在一起变成一个批处理文件。

我们需要注意的是,生成的安全证书需要同时拷贝到客户端和服务器端。客户端需要向服务器端发送这个证书,而服务器端需要检查客户端证书是否和服务器端证书一致。

客户端配置

编辑Stunnel的配置文件(位置在C:\Program Files\stunnel\stunnel.conf):

[CLIENT]
accept=22443
connect=proxyhost:8080
client=yes
cert=c:\program files\stunnel\${FILE_NAME}.pem
protocol=connect
protocolHost=192.234.191.174:443

其中各个参数的含义为:

  • accept:接受的端口(在这个例子中,如果访问远程服务需要连接到localhost端口22443)。
  • connect:远程服务器的IP地址和端口(注意这里我们使用标准HTTPS端口)。
  • client:告诉stunnel这个配置是client配置。
  • cert:连接是提供给对方的安全证书。这个证书可以是${FILE_NAME}.pem文件名也可以直接用XXXXXXXX.0文件。

如果客户端需要通过HTTPS代理连接,需要使用以下配置文件:

[CLIENT]
accept=22443
connect=proxyhost:8080
client=yes
cert=c:\program files\stunnel\${FILE_NAME}.pem
protocol=connect
protocolHost=192.234.191.174:443

这里connect处需要填入代理服务器的IP和端口,protocolHost处填入远程服务器的IP和端口。配置结束后运行stunnel程序,然后双击任务栏的图可以查看日志:

stunnel 4.34 on Win32 (stunnel)_2010-09-21_15-41-49

服务器端配置

服务器端配置比客户端稍微麻烦些。首先我们需要把先前生成的XXXXXXXX.0证书拷贝到一个文件夹中(假设这个文件夹叫CApath),所有可信任的证书都应该拷贝到这里。然后我们需要配置C:\Program Files\stunnel\stunnel.conf文件:

[SERVER]
accept=443
cert=stunnel.pem
connect=localhost:21
CApath=c:\program files\stunnel\CApath
CRLpath=c:\program files\stunnel\CRLpath
verify=3

以下是这个配置各个参数的含义:

  • accept:接受连接请求的端口(应该和客户端一致)
  • cert:服务器端发送给客户端的安全认证。因为我们的客户端不验证这个证书,所以使用标准的stunnel证书就可以。
  • connect:连接到本地或者其他局域网的网络服务(这里我们使用本地FTP服务)。
  • CApath:保存了所有可信安全证书的文件夹(所有文件名都应该是XXXXXXXX.0格式)。
  • CRLpath:保存了所有已经撤销的安全证书的文件夹(所有文件名都应该是XXXXXXXX.0格式)。这个的主要作用是当你把安全证书发布给客户以后你依然可以拒绝他的连接请求。
  • verify:验证级别。1表示如果客户提供安全证书则验证安全证书。2表示客户必须提供安全证书并验证安全证书,这个模式适合于验证从CA处购买的安全证书。3表示客户必须提供安全证书并根本本地CAPath和CRLpath来验证证书是否合法。毫无疑问这里我们应该选3。

设置完成后我们可以启动stunnel程序然后进行下简单的测试。

连接测试

首先确认服务器端和客户端的stunnel程序都已经启动,并且提供服务的网络应用程序也已经启动(这里我们是FTP服务)。打开命令行,输入:

telnet localhost 22443

这时你应该能得到一个到FTP服务器的TCP连接,同时也宣告大功告成:)以上这个例子可以使在禁止FTP的局域网中使用FTP服务,当然任何安装在服务器端的TCP服务都可以通过这种方法使用。由于Stunnel使用加密过的连接,因此没有人能看到服务器端和客户端传送的数据。需要注意的是,有些防火墙会在没有流量的时候关闭连接,因此为了长期保持连接尽量不停发送数据(简单的heartbeat就可以)。