目前不管是使用smtp.gmail.com还是imap.gmail.com,都会在SNI握手不就后立即断开,而目前SSL又是强制的,就算是STARTLS,也会交换信息,那么为了应对他代理当然是最好的,但是不是每个地方都能方便使用,这时候必须改个域名来握手,就是让服务器发送别的SNI证书.
不过,不管是HaProxy还是Nginx,都并不会改变证书,Nginx虽然可以重套证书,但是依然会继续发送Gmail的SNI,因此阻断没商量.因此完全换一个证书就很必要了,即先在VPS用自己的证书提供服务并解密所有信息,再在VPS重新加密并发送到Gmail,思路就是这样,也就是VPS上存在部分明文,并且本地为了XOAUTH,还必须用*.gmail.com的Host,所以就会出现一个握手例外.
我早期写过一个代码也能实现同样功能,不过没考虑并发因此问题挺多的,也贴出来给大家参考下思路:https://gist.github.com/nickfox-taterli/3bf15d16ca2bbeaa578cd3eca0a88aa2
阻断分析:
成功交互:
为了实现换证书,那么就得先把流量脱出来,然后再把流量用不同证书包起来,就是需要两个stunnel实例,其中脱了密的数据在本机环回网卡即可,获取证书的方法有很多,大家选择自己喜欢的就行.
先把加密流量脱密,此配置文件可以把SSL流量变普通流量,因此是脱密的.
文件:/etc/stunnel/stunnel-decrypt.conf
cert = /etc/letsencrypt/live/example.com/fullchain.pem
key = /etc/letsencrypt/live/example.com/privkey.pem
debug = 4
output = /var/log/stunnel-decrypt.log
client = yes
[pop]
accept = 127.0.0.1:10995
connect = pop.gmail.com:995
[smtp]
accept = 127.0.0.1:10465
connect = smtp.gmail.com:465
[imap]
accept = 127.0.0.1:10993
connect = imap.gmail.com:993
然后把脱密的流量再加密,这时候监听在外网的流量是加密的.
文件:/etc/stunnel/stunnel-encrypt.conf
cert = /etc/letsencrypt/live/example.com/fullchain.pem
key = /etc/letsencrypt/live/example.com/privkey.pem
debug = 4
output = /var/log/stunnel-encrypt.log
client = no
[pop]
accept = 0.0.0.0:995
connect = 127.0.0.1:10995
[smtp]
accept = 0.0.0.0:465
connect = 127.0.0.1:10465
[imap]
accept = 0.0.0.0:993
connect = 127.0.0.1:10993
因为我这个不标准,为了启动他们就得启动两个stunnel,毕竟他们在系统里是用着同一个PID文件,所以我们就不能依赖服务方法了,所以屏蔽服务,并且其实只要执行,他就会自己塞到后台,非常放心.
systemctl mask stunnel4
/usr/bin/stunnel4 /etc/stunnel/stunnel-decrypt.conf
/usr/bin/stunnel4 /etc/stunnel/stunnel-encrypt.conf
然后修改host为这三条,那么其他配置就直接可以用了. (104.251.224.215 换成你的 VPS 的 IP 地址)
当然,你不怕安全问题也可以用我的服务器,基于OAUTH确实也窃取不了密码,但是信息可就明文了,自己考虑吧.
104.251.224.215 smtp.gmail.com
104.251.224.215 imap.gmail.com
104.251.224.215 pop.gmail.com
如果不想做安全例外用自己域名可以吗?当然是可以的,邮件服务器填自己域名对应证书没有安全例外,但是同时也不能使用OAUTH登录,要用应用密码,我个人觉得还是接受安全例外吧,毕竟一次性的.
为什么还不可以?因为有些VPS他也会拦截流量,我也是想不明白啊.
当然这里建议使用应用密码,因为OAUTH2还涉及两个域名,不少地区依然无法使用,这两个域名就算反向代理了,在Thunderbird也因为证书错误不允许忽略,其他App不清楚.
104.251.224.215 imap.gmail.com
104.251.224.215 smtp.gmail.com
104.251.224.215 pop.gmail.com
104.251.224.215 accounts.google.com
104.251.224.215 www.googleapis.com