13520606004

在搭建支持HTTPS的前端代理服务器时候,通常会遇到让人头痛的证书问题。根据HTTPS的工作原理,浏览器在访问一个HTTPS站点时,先与服务器建立SSL连接,建立连接的第一步就是请求服务器的证书。而服务器在发送证书的时候,是不知道浏览器访问的是哪个域名的,所以不能根据不同域名发送不同的证书。用过GoAgent的人都知道需要给浏览器导入证书才能使用HTTPS正常登录Twitter等网站。

SNI(Server Name Indication)是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。一句话简述它的工作原理就是,在连接到服务器建立SSL链接之前先发送要访问站点的域名(Hostname),这样服务器根据这个域名返回一个合适的证书。目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8已经内置这一功能,据说新版的nginx也支持SNI。

HTTPS与SNI扩展,一个IP绑定多个SSL证书

Github上有一个小巧的支持SNI的代理服务器,https://github.com/dlundquist/HTTPS-SNI-Proxy

我down下来,在一个VPS上编译(需要安装pcre的开发库),写了一个简单的配置文件,把所有访问443端口的HTTPS请求都进行代理。启动sni_proxy之后,修改本地的hosts文件,把twitter.com映射为服务器的IP地址,比如我的是

184.82.206.107 twitter.com

然后,在浏览器里访问 https://twitter.com/。

HTTPS与SNI扩展,一个IP绑定多个SSL证书

看到木有,这是活生生的twitter的证书。

HTTPS与SNI扩展,一个IP绑定多个SSL证书