2013-09-22

GoAgent证书问题一例

昨天准备在老婆的电脑上用一下GoAgent,结果发现很多网站都不能用。很奇怪的是,Twitter页面能打开,但CSS/JS看起来基本上都不对。而在我自己的电脑(LAN内部)上却是好的。所以很明显是Local而不是Network的问题。
看GoAgent控制台上的日志,问题似乎跟SSL的连接建立有关系。再把Chrome的“审查元素”功能打开,Console里面一堆错误。随便挑了个页面试图打开,好了,这下清楚了,证书有问题。
看了看GoAgent的官方Q&A,基本上只提到说证书需要导入。很多在网上问这类问题的人,得到的也是类似回答。但问题在于,证书的导入是没有问题的,重新导入也没有效果。而且并不是所有网站都不能通过GoAgent代理。

其实问题很简单:GoAgent仿冒的证书被占用啦。
官方其实也提到过这个事情:
因为GAE平台限制,没法支持真正的ssl加密,goagent只能通过伪造证书的方式做到代理ssl加密的网站,这个证书就是用来欺骗浏览器的。
GoAgent实际上相当于一个“中间人”。当访问HTTPS站点时,就得采用SSL中间人攻击的类似方式,才能完成代理的工作。SSL中间人攻击怎么弄?导入受信任的根证书,然后利用这个根证书签发的证书把内容拆开后重新组装、加密、封包,骗完甲方骗乙方,欺骗通讯双方。否则两端任何一方觉得这内容不对劲,SSL传输就会失败。这其实也就是为什么必须要干掉CNNIC相关的根证书的原因

所以,对于每一个HTTPS站点,GoAgent都会生成一份用自己根证书签发的数字证书。看看GoAgent的local目录下,如果访问过HTTPS站点,则一定会有一个certs目录。这生成的证书,就放在这个certs目录下。其实一看这个目录里面都有些什么文件,就很明白了:
这次的问题在于,GoAgent有不同的版本,其携带的根证书也是变化过的。至少我机器上随便打开CertMgr就见到了五个不同的版本:
如果升级的时候不把certs目录清空,就有可能会有部分站点对应的证书还是以前的老的、用旧的根证书签发出来的。GoAgent客户端一看,噢,证书已经有了,就不再重新生成了。但Chrome觉得证书不对,于是SSL握手就被挡了。

解决办法很简单,每次升级GoAgent的时候,把local/certs目录删掉。或者干脆每次用新目录来升级好了。

没有评论:

发表评论