最近在用stunnel做透明代理,配合haproxy做ssl方案,在用户和原有的反向代理之间加入stunnel,这样可以让用户和stunnel之间走ssl,stunnel之后的真实web就不用负担https的开销。
记录一下配置过程和问题,以下安装方式在centos和ubuntu上都配置通过:
首先先去stunnel官网上获取安装包,因为要给stunnel打haproxy的补丁,而haproxy官方提供的补丁目前版本是4.32的,所以stunnel选择4.32版本,官方提供的ftp上可以找到ftp://ftp.stunnel.org/stunnel/obsolete/4.x/,这里使用rsync同步对应的版本:
1: rsync rsync.stunnel.org::stunnel/obsolete/4.x/stunnel-4.32.tar.gz stunnel-4.32.tar.gz
2: wget http://haproxy.1wt.eu/download/patches/stunnel-4.32-xforwarded-for.diff
3: tar -zxvf stunnel-4.32.tar.gz
4: cd stunnel-4.32
5: patch -p1 < ../stunnel-4.32-xforwarded-for.diff
6: ./configure
7: make && make install
在上述过程中如果出现"Couldn't find your SSL library installation dir",是缺少openssl,安装后在进行上述过程即可:
1: apt-get install libcurl3-openssl-dev
或:
yum install openssl-devel
配置stunnel.conf:
1: sslVersion=all
2: fips=no
3: cert=/usr/local/etc/stunnel/stunnel.pem
4: CAfile=/usr/local/etc/stunnel/cacert.pem
5: pid =/var/run/stunnel.pid
6: setuid=root
7: setgid=root
8:
9: socket=l:TCP_NODELAY=1
10: socket=r:TCP_NODELAY=1
11: output=/var/log/stunnel.log
12:
13: [https]
14: accept=443
15: connect=127.0.0.1:8080
16: TIMEOUTclose=0
17: xforwardedfor=yes
-----------------------------------------------------------------------------
搞定上面的步骤就可以运行了:
1: stunnel
在运行stunel的时候若出现routines:FIPS_mode_set:fingerprint does not match错误,可以通过设置上述参数fips=no解决。若出现nobody权限,可设置:
1: chmod 755 /var/run/stunnel/
-------------------------------------------------------------------------------
关于ssl证书
使用自己签发的证书:
1: openssl req -new -x509 -days 365 -nodes -out stunnel.pem -keyout stunnel.pem
若是现有的证书导入pfx和CA(配置文件中设置对应的CAfile参数):
1: openssl
2: //cer转pem
3: openssl>x509 -in cacert.cer -out cacert.pem
4: //pfx转pem
5: openssl>pkcs12 -in stunnel.pfx -out stunnel.pem -nodes
通常为了简化证书的使用,我们会签发或购买如 *.xxx.org的证书,这样二级域名下的站点都可共用,要注意的是*.*.xxx.org是无效的
-------------------------------------------------------------------------------
其他
stunnel只能对linux机器进行代理
可以区分ip,ip+端口来代理
简单高效,系统利器:)
顺便附带haproxy安装:
在这里找你要安装的版本http://haproxy.1wt.eu/download/1.4/src/
以centos5安装为例:
1: wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.9.tar.gz
2: tar -zxvf haproxy-1.4.9.tar.gz
3: cd haproxy-1.4.9
4: make TARGET=linux26 PREFIX=/usr/local/
5: make install PREFIX=/usr/local/
一些实际应用中的问题和解决方法
IE6下使用SSL通道时出现“Page can not load”问题,是由于openssl支持的问题,官方有一段FAQ:
http://www.stunnel.org/?page=faq
http://www.daniweb.com/hardware-and-software/microsoft-windows/web-browsers/threads/50765
stunnel做了兼容,不过没有附上具体的解决方法,下面是解决方法,修改一下stunnel.conf配置文件即可:
1: ciphers=RC4-SHA
2: options=DONT_INSERT_EMPTY_FRAGMENTS
顺便列一下IE6支持的加密方式以供选择(完整的可到openssl官网上查找):
SSL_RSA_WITH_RC4_128_MD5
SSL_RSA_WITH_RC4_128_SHA
SSL_RSA_WITH_3DES_EDE_CBC_SHA
SSL2_CK_RC4 SSL2_CK_3DES
SSL2_CK_RC2 SSL_RSA_WITH_DES_CBC_SHA
SSL2_CK_DES SSL_RSA_EXPORT1024_WITH_RC4_56_SHA
SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA
SSL_RSA_EXPORT_WITH_RC4_40_MD5
SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
SSL2_CK_RC4_EXPORT40
SSL2_CK_RC2_EXPORT40
SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
SSL_DHE_DSS_WITH_DES_CBC_SHA
SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA
选取合适的加密算法即可,可以通过log来查看算法加载是否成功:
tail -f /var/log/stunnel.log
上图说明ciphers设置不正确,还要注意的是配置文件中的sslVersion会影响相关算法的匹配
-------------------------------------------------------------------------------------------------------
由于客户端到stuunel是ssl,haproxy到web走的是http,也就是说实际请求的url是http的,为了让web端能知晓客户端请求的url是http还是https,可通过如下配置:
1: option forwardfor
2: option httpclose
3: reqadd X-Forwarded-Proto:\ https
在web端可通过获取request header[“X-Forwarded-Proto”]来分辨
需要注意的是关于httpclose配置:若没有此项,只有第一次请求才会传递X-Forwarded,开启此项则无法keepalive,如无法windows验证
-------------------------------------------------------------------------------------------------------
xp系统ie打补丁后,导致https无法打开的问题:
http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=6429fd02-8138-4919-9942-80d62ecef22e&DisplayLang=zh-cn