分类
知识中心

Apache单IP配置多个HTTPS虚拟主机方案

在Apache文档中提到,不能在单个IP上同时有多个按名字识别的虚拟主机(“named virtual host”),其实不完全是这样,接下来我们就来演示下如何打破这一魔咒。

  使用SNI

SNI全称Server Name Indication(服务器名称指示),这个问题可以解决apache中的单IP多HTTPS虚拟主机,只有默认第一个站点的SSL生效的问题。但是这些技术需要浏览器的版本支持

  支持SNI的浏览器

*Mozilla Firefox 2.0 or later

*Opera 8.0 or later(the TLS 1.1 protocol must be enabled)

*Internet Explorer 7(Vista,not XP)or later

*Google Chrome(Vista,not XP)(NOT Chromium)

*Safari 3.2.1 Mac OS X 10.5.6

  支持SNI的web容器

*apache版本在2.2.12以上

*需要mod_gnutls或者mod_ssl模块的支持

*Openssl在0.9.8j后的版本也都支持了SNI的功能

  配置Apache

打开Apache/conf/extra/httpd-vhost.conf文件并找到以下参数进行配置。

Listen 443

NameVirtualHost*:443

<VirtualHost*:443>

ServerName www.test1.com

SSLOptions StrictRequire

DocumentRoot/path/to/ssl/enabled/site

SSLProtocol all-SSLv2-SSLv3

注意,这里我们同时禁用了SSLv2、SSLv3不安全的协议。

SSLHonorCipherOrder on

SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM

SSLCertificateFile conf/server.crt

SSLCertificateKeyFile conf/server.key

SSLCertificateChainFile conf/ca.crt

完成上述操作后,将CA证书ca.crt配置到该路径下。

<Directory/path/to/ssl/enabled/site/>

SSLRequireSSL

Order Deny,Allow

Allow from All

</Directory>

</VirtualHost>

“`

最后,保存httpd-vhost.conf文件并退出,使用https方式访问网站,测试证书配置是否成功。

分类
知识中心

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

在搭建支持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证书-1

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证书-2

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

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