要实现通过SSL对客户端和服务器之间的流量进行加密,我们可以选择Stunnel这个开源软件,这个软件实现了客户端和服务器端之间的流量通过TLS进行加密传输。
例如我们现在有一台服务器,在其上安装了代理服务,我们想对连接这个代理服务器的流量进行加密,具体的做法如下:
通过Squid开启代理服务
安装必要的软件
apt-get install apache2-utils -y
apt-get install squid -y
配置Squid
1. 生成HTTP认证文件
htpasswd -c /etc/squid/squid.passwd <登录用户名>
2. 修改监听地址和端口
修改/etc/squid/squid.conf文件,找到TAG: http_port注释,将http_port 3128修改为127.0.0.1:3128
3. 修改访问权限
修改/etc/squid/squid.conf文件,找到TAG: auth_param注释,添加以下语句
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/squid.passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
找到TAG: acl,添加
acl ncsa_users proxy_auth REQUIRED
找到TAG: http_access,添加
http_access deny !ncsa_users
http_access allow ncsa_users
4. 重启Squid服务
sudo service squid restart
现在代理服务已经配置好了。
通过Stunnel开启加密服务
安装软件
apt-get install stunnel4 -y
生成证书
1. 生成根CA证书
openssl genrsa -out root-ca.key 2048
openssl req -x509 -new -nodes -key root-ca.key -sha256 -days 1024 -out root-ca.crt
2. 生成中间CA证书
openssl genrsa -out inter-ca.key 2048
openssl req -new -key inter-ca.key -out inter-ca.csr
openssl x509 -req -in inter-ca.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out inter-ca.crt -extfile inntext.cnf
在生成中间证书时,我们定义了一个扩展文件inntext.cnf,内容如下:
basicConstraints=critical,CA:TRUE
3. 为服务器生成证书
openssl genrsa -out proxy-server.key 2048
openssl req -new -key proxy-server.key -out proxy-server.csr
openssl x509 -req -in proxy-server.csr -CA inter-ca.crt -CAkey inter-ca.key -CAcreateserial -out proxy-server.crt -extfile proxy-server.ext
扩展文件proxy-server.ext的内容如下,里面的IP地址需要对应服务器的公网地址,DNS如果没有域名可以自己定义一个,然后在客户端的hosts文件中添加这个自定义域名和公网地址的映射:
subjectAltName = @ABC
extendedKeyUsage = serverAuth[ABC]# 域名,如有多个用DNS.2,DNS.3…来增加
DNS.1 = abc.com
# IP地址
IP.1 = 123.123.123.123
4. 生成证书链
cat proxy-server.crt inter-ca.crt root-ca.crt > proxy-server-chain.crt
5. 修改Stunnel配置
修改/etc/stunnel/stunnel.conf,内容如下:
client = no
[squid]
accept = 3129
connect = 127.0.0.1:3128
cert = /etc/stunnel/proxy-server-chain.crt
key = /etc/stunnel/proxy-server.key
6. 重启Stunnel服务
sudo service stunnel4 restart
Chrome浏览器设置代理
现在Squid代理服务已经通过Stunnel进行加密了。打开Chrome浏览器,在设置中找到HTTP/SSL证书,然后导入之前生成的root-ca.crt证书到受信任的根证书。然后设置代理服务器到我们Stunnel配置的服务器地址和accept端口即可,建议可以通过Proxy SwitchyOmega插件来进行代理服务器的设置。