IT技术博客大学习 共学习 共进步

SSL多域名绑定证书的解决方案

忘我的追寻 2016-02-07 14:41:36 浏览 2,761 次

之前有几篇文章已经关注过加密解密证书和HTTTPS的一些基本原理。HTTPS、SSL与数字证书介绍公钥私钥加密解密数字证书数字签名详解。这里想探讨一下单一的web服务中多个域名共享一个证书或者使用多个证书进而使用多域名的HTTPS的问题。

在《HTTPS、SSL与数字证书介绍》这篇文章中介绍了,证书是在SSL握手阶段交换的,而域名是在HTTP请求的Header中传输到服务端的,HTTP协议在SSL之上,而两层协议之间是无法共享数据的。因此证书是在建立HTTP的Session之前就已经决定了。但是有越来越多的场景需要同一个Server监听多个域名,对外呈现多个入口。而我们知道,客户端会校验证书中的网址、颁发者的公钥和过期时间等信息。后面两个可以通过付费到具有公信力的颁发机构颁发证书的方式解决。网址匹配有点麻烦,网址一般填写在证书的Common Name上面,因此网址与域名是一一对应的关系。而多个不同的域名可以解析成同一个IP地址,这样如何做到给每个域名都绑定不同的证书?是给每个域名都分配一个服务器,绑定单独的IP地址吗?但是在规模不大的情况下只部署有限的服务器。

最典型的解决方案是Apache的Virtual Host技术,该技术允许在Apache HTTP的配置文件中,配置多个独立的IP地址,每个地址绑定各自的网站资源以及证书,各个站点之间只共享计算资源,内容彼此隔离。这是最直接的遵照证书与连接绑定的方式。

另外,如果只是同一个站点下面分出很多个子域名,那么可以直接申请通配证书,将证书的Common Name填写为域名的二级子域名通配的形式即可,如下图:

通配域证书

这种形式只能通配所有的二级域名,对于codefine×co(”×”替换成”.”)本身却不能匹配,对于t×blog×codefine×co这样的再下一级的域名也无法匹配。

这样的问题早就有人提出来了,SSL协议也已经有扩展来支持这个问题。Subject Alternative Name(SAN)来解决这个问题。对于证书管理这里推荐一个好用图形界面工具:xca

多域名证书

使用XCA工具可以轻松制作和管理各种证书及证书库。

XCA

值得注意的是,“使用者可选名字”与多个Common Name并不是一回事。多个Common Name无法实现多域名。只是在单域名证书时,将Common Name用作域名而已。

上面提到的方法都是在一个证书里面解决问题。如果必须为每一个域名都申请一个证书呢?SSL协议的另外一个扩展也可以用于支持单IP地址使用多个证书。Server Name Indication(SNI)技术用于实现在单个IP地址上面为多个域名分配不同的证书。这个扩展到基本机制是在握手阶段浏览器或者其他HTTP客户端即可将所请求的域名信息发送给服务端,服务端根据域名信息,从备选的证书库中返回匹配的证书。显然这里需要有客户端和服务端都支持该扩展协议才行。目前大多数浏览器都支持该特性。大多数的WEB服务器如Apache HTTP Server、Nginx都支持。Jetty在9.3的某个版本也开始支持该特性。

对于域名与证书绑定的问题,在中文技术网站上面介绍不多,国外的网站上面才能查到比较详尽的介绍。

建议继续学习

  1. SSL证书的分类(按功能) (阅读 10,162)
  2. nginx 使用 ssl (阅读 7,564)
  3. 解决linux下安装ssl后,apache重启时需要密码 (阅读 6,384)
  4. SSL Proxy (阅读 5,043)
  5. 通过ssldump来分析ssl协议过程 (阅读 3,904)
  6. SSL窃听攻击实操 (阅读 3,764)
  7. 给Nginx配置一个自签名的SSL证书 (阅读 3,542)
  8. Linux下自行颁发SSL证书 (阅读 2,762)
  9. [Android]用WebView访问证书有问题的SSL网页 (阅读 2,745)
  10. lihttpd ssl 配置 (阅读 2,262)