首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Squid使用SSLBump正向代理(1)

Squid使用SSLBump正向代理(1)

背景

最近需要使用nodeJs访问一个历史久远的网站,那个网站的服务器证书是错误的,且使用的协议是TLSv1.0。浏览器上不得不使用IE并关闭各种安全设置和设置为兼容模式才能正常访问。Nodejs的新版本已经不支持这种不安全的协议,所以需要搭建一个代理服务进行访问。刚开始使用的是mitmproxy ,当时的最新版本对于SSL错误会报错,所以将源码中校验部分去掉就可以正常使用了。但部署到生产环境,会出现cpu占用过高的情况。所以后面换了Squid。

部署Squid参考了一篇文章,原文:here,下面是简单翻译。
正文

Squid是个很强大的Web代理,它可以应用于无线认证、重定向、用户身份验证、日志记录等。但其在SSL方面一直存在局限性。在3.2版本之前,Squid的策略只是简单地传递SSL加密流量,因为它无法校验受信任的SSL链接。对于每个SSL连接也无法给用户做预警。但3.5版本后允许更多的控制,但要注意仍然无法校验受信任的SSL链接。

这里不会过多地介绍使用SSL Bump配置Squid以外的知识,对于编译和配置squid的细节你最好看下官方文档。 如果通过代理自动监测,通知浏览器连接到代理服务器,这样是挺简单的。但有些用户可能会试图规避这一点,并尝试直接连接。 在这种情况下,我们需要强制这些用户通过截取流量来使用代理。SSL Bumping的前提是中间人攻击,但由于这是在您的用户清楚所有流量都是检查过的环境中完成的,因此这并不是真正的攻击,这只是一种策略。Squid用于执行SSL Bumping有一些新方法,但是我会总结出最具实战性的方法:Squid收到一个https请求,然后为用户建立安全连接。 远程连接建立后,Squid会重新加密所有流量; 这时候的加密使用的是本地私钥,以及本地证书颁发机构即时创建出来的证书。
所以我们首先要确保的是你已经安装了3.5或更高版本的Squid。尽管3.2,3.3以及3.4版本也能实现,但3.5版本后SSL Bump的指令有了些显著变化。另外,编译Squid时需要带上‘–with-openssl’参数。

在CentOS我使用以下参数来编译Squid(foam:我带上–enable-ipf-transparent参数会报错,所以我是去掉再编译的)

    ./configure \
            --prefix=/usr \
            --exec-prefix=/usr \
            --includedir=/usr/include \
            --datadir=/usr/share \
            --libdir=/usr/lib64 \
            --libexecdir=/usr/lib64/squid \
            --localstatedir=/var \
            --sysconfdir=/etc/squid \
            --sharedstatedir=/var/lib \
            --with-logdir=/var/log/squid \
            --with-pidfile=/var/run/squid.pid \
            --with-default-user=squid \
            --enable-silent-rules \
            --enable-dependency-tracking \
            --with-openssl \
            --enable-icmp \
            --enable-delay-pools \
            --enable-useragent-log \
            --enable-esi \
            --enable-follow-x-forwarded-for \
            --enable-ipf-transparent \
            --enable-auth

接下来我们需要生成本地的SSL证书,这里我使用的是简单的命令,没有在意怎么去加密。

    # Generate Private Key
    openssl genrsa -out example.com.private 2048  

然后是创建Certificate Signing Request(CSR),即证书注册请求。

    # Create Certificate Signing Request
    openssl req -new -key example.com.private -out example.com.csr  

    Country Name (2 letter code) [XX]:US  
    State or Province Name (full name) []:Illinois  
    Locality Name (eg, city) [Default City]:Chicago  
    Organization Name (eg, company) [Default Company Ltd]:Example Company LTD.  
    Organizational Unit Name (eg, section) []:Information Technology  
    Common Name (eg, your name or your server's hostname) []:Example Company LTD.  
    Email Address []:  
    Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:  
    An optional company name []:Example Company LTD.  

请注意,我并没有给‘Common Name’ 设置一个域名。因为Squid会在用户请求时,使用当前访问的域名动态生成证书。接下来,我们给CSR生成个签名证书。

    # Sign Certificate
    openssl x509 -req -days 3652 -in example.com.csr -signkey example.com.private -out example.com.cert

完成以上操作后,请将私钥和证书复制到Squid能够访问的目录。另外,请确保存放私钥的目录是安全的。Squid代理用户需要拥有访问证书的权限,并作为受信任的根证书安装到每个用户的计算机上。 这是我没有使用*或一个域名作为‘Common Name’的真正原因,因为当作为证书颁发机构加载时,该属性就会被固定了。
返回列表