欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Apache环境配置多域名证书,实现不同域名部署不同SSL证书 有大用


如何在一台Apache服务器上配置多个SSL证书不同、域名不同的网站?

要实现此功能,您需要支持SNI(Server Name Indication),也就意味着您需要满足以下条件:apache 2.2.12以上版本openssl 0.9.8f以上版本

工具/原料

 
  • apache 2.2.12以上版本
  • openssl 0.9.8f以上版本

方法/步骤

 
  1. 1、如何在apache上部署证书,请查阅 apache部署指南 。

    如何在Apache上针对不同域名部署不同SSL证书?
    如何在Apache上针对不同域名部署不同SSL证书?
  2. 2、如何实现不同域名部署不同SSL证书。

    您可以将所有站点配置部署在一个配置文件下,也可以分别添加在各个站点配置文件下。参考以下配置:

    <NameVirtualHost *:443>listen 443

    <VirtualHost *:443>ServerName www.yoursite.comDocumentRoot /var/www/siteSSLEngine onSSLProtocol all -SSLv2 -SSLV3SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!aNULL:!eNULLSSLCertificateFile /path/to/2_domain1.com.crtSSLCertificateKeyFile /path/to/3_doamin1.com.keySSLCertificateChainFile /path/to/1_root_bundle.crt</VirtualHost>

    <VirtualHost *:443>ServerName www.yoursite2.comDocumentRoot /var/www/site2SSLEngine onSSLProtocol all -SSLv2 -SSLV3SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!aNULL:!eNULLSSLCertificateFile /path/to/2_domain2.com.crtSSLCertificateKeyFile /path/to/3_doamin2.com.keySSLCertificateChainFile /path/to/1_root_bundle.crt</VirtualHost>

     

  3. 3

    3、最后重启apache。当您用浏览器访问时,请注意您的浏览器版本是否支持SNI功能呢,请查阅 支持SNI的浏览器

    END
 
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
举报作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。

来自  http://jingyan.baidu.com/article/e3c78d64b15af83c4c85f50e.html



要实现Apache服务器不同域名部署不同SSL证书,您需要支持SNI(Server Name Indication),也就意味着您需要满足以下条件:

(1)apache 2.2.12以上版本

(2)openssl 0.9.8f以上版本

首先您需要知道如何在Apache上部署SSL证书,请查阅Apache SSL证书部署指南。

 

下面来看下Apache服务器如何实现不同域名部署不同SSL证书。

您可以将所有站点配置部署在一个配置文件下,也可以分别添加在各个站点配置文件下。

参考以下配置:

<NameVirtualHost *:443>

listen 443

----------------------------------------------------------------------------------------

<VirtualHost *:443>

ServerName www.yoursite.com

DocumentRoot /var/www/site

SSLEngine on

SSLProtocol all -SSLv2 -SSLV3

SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!aNULL:!eNULL

SSLCertificateFile /path/to/2_domain1.com.crt

SSLCertificateKeyFile /path/to/3_doamin1.com.key

SSLCertificateChainFile /path/to/1_root_bundle.crt

</VirtualHost>

----------------------------------------------------------------------------------------

<VirtualHost *:443>

ServerName www.yoursite2.com

DocumentRoot /var/www/site2

SSLEngine on

SSLProtocol all -SSLv2 -SSLV3

SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!aNULL:!eNULL

SSLCertificateFile /path/to/2_domain2.com.crt

SSLCertificateKeyFile /path/to/3_doamin2.com.key

SSLCertificateChainFile /path/to/1_root_bundle.crt

</VirtualHost>

最后重启Apache服务器。

当您用浏览器访问时,请注意您的浏览器版本是否支持SNI功能,请查阅支持SNI的浏览器

来自  https://www.gworg.com/ssl/255.html

 

问题:Apache配置了多个SSL虚拟主机,但是每次访问都只能访问到Apache配置中的第一个虚拟主机
 
问题分析:
  1. 什么是SSL和HTTPS

    安全套接层Secure Sockets Layer,SSL)是一种安全协议,在网景公司(Netscape)推出首版Web浏览器的同时提出,目的是为网络通信提供安全及数据完整性保障,SSL在传输层中对网络通信进行加密。

    SSL采用公开密钥技术,保证两个应用间通信的保密性可靠性,使客户與服务器应用之间的通信不被攻击者窃听。它在服务器和客户机两端可同时被支持,目前已成为互联网上保密通讯的工业标准。现行的Web浏览器亦普遍将HTTP和SSL相结合,从而实现安全通信,即我们所说的HTTPS。

    HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL

  2. SSL的工作原理

    SSL已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输.它位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

    介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头

     

    Apache配置多个SSL虚拟主机
    图一,SSL协议层
    • SSL握手协议(SSL Handshake Protocal)

      握手协议是客户机和服务器用SSL连接通信时使用的第一个子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中最复杂的协议就是握手协议。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。握手协议是在应用程序的数据传输之前使用的。下图为HTTPS握手的过程:

       

      Apache配置多个SSL虚拟主机
      图二,HTTPS握手的4个阶段


      Apache配置多个SSL虚拟主机 图三,双向证书认证的SSL握手过程

      阶段Ⅰ:建立安全能力
      启动逻辑连接,建立这个连接的安全能力。首先客户机向服务器发出Client_hello消息并等待服务器响应,随后服务器向客户机返回Server_hello消息,对Client_hello消息中的信息进行确认。Client_hello消息和Server_hello包括“版本”,“客户随机数”,“会话ID”,“密码套件”,“压缩方法”等信息
      阶段Ⅱ:服务器鉴别与密钥交换
      服务器启动SSL握手第2阶段,是本阶段所有消息的唯一发送方,客户机是所有消息的唯一接收方。该阶段分为4步:
      (a)证书:服务器将数字证书和到根CA整个链发给客户端,使客户端能用服务器证书中的服务器公钥认证服务器。
      (b)服务器密钥交换(可选):这里视密钥交换算法而定
      (c)证书请求:服务端可能会要求客户自身进行验证。
      (d)服务器握手完成:第二阶段的结束,第三阶段开始的信号
      阶段Ⅲ:客户机鉴别与密钥交换
      客户机启动SSL握手第3阶段,是本阶段所有消息的唯一发送方,服务器是所有消息的唯一接收方。该阶段分为3步:
      (a)证书(可选):为了对服务器证明自身,客户要发送一个证书信息,这是可选的,在IIS中可以配置强制客户端证书认证。
      (b)客户机密钥交换(Pre-master-secret):这里客户端将预备主密钥发送给服务端,注意这里会使用服务端的公钥进行加密。
      (c)证书验证(可选),对预备秘密和随机数进行签名,证明拥有(a)证书的公钥。
      阶段Ⅳ:完成
      客户机启动SSL握手第4阶段,使服务器结束。该阶段分为4步,前2个消息来自客户机,后2个消息来自服务器

    • SSL记录协议(SSL Record Protocal)

      记录协议在客户机和服务器握手成功后使用,即客户机和服务器鉴别对方和确定安全信息交换使用的算法后,进入SSL记录协议,记录协议向SSL连接提供两个服务:
      (1)保密性:使用握手协议定义的秘密密钥实现
      (2)完整性:握手协议定义了MAC,用于保证消息完整性

       

      Apache配置多个SSL虚拟主机
      图四,记录协议过程

      关于数字证书原理的可以查看: http://blog.csdn.net/jiangtongcn/article/details/13015071

  3. 问题分析

    当Apache处理一个来自浏览器请求访问域名为基础的虚拟主机时,这个请求包括主机头(例如 www.example.com). Apache通过这个主机头来决定这个请求需要路由到哪个虚拟主机。它的路由路线与它的工作方式和连接类型没有关系,不管是HTTP还是HTTPS。SSL的虚拟主机的问题是HTTPS的通信是建立在一个SSL的TCP连接上。这意味着这个请求的任何内容,包括最重要的主机头,Apache用来纠正往哪路由这个请求从而能使这个请求到达目的虚拟主机,也是不知道的直到SSL的握手成功。这个问题在于Apache需要把证书传给浏览器,浏览器通过证书来决定和哪一个虚拟主机建立SSL TCP连接,而Apache只能将第一个SSL的虚拟主机的证书传给浏览器。所以,浏览器只能与第一个SSL虚拟主机建立连接。这是个典型的“是先有鸡还是先有蛋的问题”。Apache上的虚拟主机只有和浏览器建立SSL连接之后才能进行HTTP通信,才能通过主机头信息决定路由哪个虚拟主机。

    举个例子:

    让我们想象,我们在Apache服务器上通过端口443建了两个以域名为基础的虚拟主机。第一个虚拟主机它的主机名为 www.example.com,第二个虚拟主机的的主机名为www2.example.com。如果虚拟主机www.example.com在Apache的配置文件中是第一个虚拟主机,那么它会成为443端口的默认虚拟主机。因此,任何客户端请求http://www2.example.com都会收到服务器传给它的www.example.com的证书。当然,浏览器不喜欢这个证书,而且会报一个“这个证书和请求的虚拟主机不一致”的错,而且请求会被路由到www.example.com上。



解决方案:
这个问题有两个解决方法:
  1. 使用SSL/TSL的Server Name Indication extension(http://en.wikipedia.org/wiki/Server_Name_Indication)在SSL握手时来发送证书,从而建立加密隧道。这个方法的问题是不是所有的浏览器都支持它。
  2. Apache上的SSL虚拟主机使用同一个证书。这个证书主机名是所有SSL虚拟主机的通配主机名。

举个例子:Apache上有两个SSL虚拟主机,一个是www.example.com,另一个是www2.example.com。那么证书的主机名则可以是*.example或www*.example.com等一些通配的主机名。

请看如下的Apache配置
...
Listen 443
...
...SSL stuff...

 

...VirtualHost stuff...

SSLEngine on
SSLCertificateFile /path/to/*.example.com.crt
SSLCertificateKeyFile /path/to/*.example.com.key

...VirtualHost stuff...

 


 
ServerName www2.example.com:443

...VirtualHost stuff...

SSLEngine on
SSLCertificateFile /path/to/*.example.com.crt
SSLCertificateKeyFile /path/to/*.example.com.key

...VirtualHost stuff...

 


关于HTTPS原理以及通信的整个过程比较复杂。如果大家有不理解和我叙述不周的地方,欢迎大家指正出来!

来自  http://blog.sina.com.cn/s/blog_48a587210101folu.html

普通分类: