概述
传统的每个SSL证书签发,每个证书都需要独立ip,假如你编译openssl和nginx时候开启TLS SNI (Server Name Identification) 支持,这样你可以安装多个SSL,绑定不同的域名,可以共享同一个ip。
近期由于遇到申请通配符版证书时,比如*.bb.com这样的二级域名时,主域名为二级域名时,主域名和其子通配符下的域名可以用同一张证书,但是像*.aa.bb.com这样的证书不包含其三级主域名,只有二级的域名支持。此时便会遇到这种一个IP绑定多个证书的情况。
1、编译openssl支持TLS SNI 注意:最新版的openssl可能不支持enable-tlsext
cd /usr/src/wget http://www.openssl.org/source/openssl-0.9.8l.tar.gztar zxvf ./openssl-0.9.8l.tar.gzcd ./openssl-0.9.8l./config enable-tlsextmakemake install
2、编译nginx支持TLS SNI,首先验证本地的nginx是TLS SNI是否支持:
/usr/local/nginx/sbin/nginx -V nginx: nginx version: nginx/1.1.0 nginx: TLS SNI support disable
cd /usr/src/
wget http://nginx.org/download/nginx-0.7.67.tar.gztar zxvf nginx-0.7.67.tar.gzcd nginx-0.7.67
./configure \
--prefix=/usr \--sbin-path=/usr/sbin/nginx \--conf-path=/etc/nginx/nginx.conf \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \--pid-path=/var/run/nginx.pid \--lock-path=/var/lock/nginx.lock \--user=nobody\--group=nobody\--with-http_stub_status_module\--with-http_ssl_module \--with-http_flv_module \--with-http_gzip_static_module \--http-client-body-temp-path=/var/tmp/nginx/client_temp/ \--http-proxy-temp-path=/var/tmp/nginx/proxy_temp/ \--http-fastcgi-temp-path=/var/tmp/nginx/fcgi_temp/ \--with-openssl=../openssl-0.9.8l/makemv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp objs/nginx /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -V
如果成功的话此时会看到: TLS SNI support enabled
这样就可以在 同一个IP上配置多个HTTPS主机了。
实例如下:
server { listen 443; server_name *.www.aabb.com; index index.html index.htm index.php; root /data/wwwroot/www.aabb.com/webroot; ssl on; ssl_certificate "/usr/local/nginx/conf/ssl/_.www.aabb.com.public.cer"; ssl_certificate_key "/usr/local/nginx/conf/ssl/_.www.aabb.com.private.key"; ......} server { listen 443; server_name www.aabb.com; index index.html index.htm index.php; root /data/wwwroot/www.aabb.com/webroot; ssl on; ssl_certificate "/usr/local/nginx/conf/ssl/www.aabb.com.public.cer"; ssl_certificate_key "/usr/local/nginx/conf/ssl/www.aabb.com.private.key"; ......}
这样访问每个虚拟主机都正常。
------------------------------------------------------------------------------------
使用Haproxy来实现
配置Haproxy的配置文件:
按照以上配置就可以实现多证书的HTTPS,依次访问上面的访问会发现,相关的证书与之配对。