最近在用stunnel做透明代理,配合haproxy做ssl方案,在用户和原有的反向代理之间加入stunnel,这样可以让用户和stunnel之间走ssl,stunnel之后的真实web就不用负担https的开销。

stunnel+haproxy SSL以及问题记录_haproxy

stunnel+haproxy SSL以及问题记录_haproxy_02

记录一下配置过程和问题,以下安装方式在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:

stunnel+haproxy SSL以及问题记录_haproxy_03

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

stunnel+haproxy SSL以及问题记录_haproxy_04

上图说明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