欢迎各位兄弟 发布技术文章
这里的技术是共享的
如何在一台Apache服务器上配置多个SSL证书不同、域名不同的网站?
要实现此功能,您需要支持SNI(Server Name Indication),也就意味着您需要满足以下条件:apache 2.2.12以上版本openssl 0.9.8f以上版本
1、如何在apache上部署证书,请查阅 apache部署指南 。
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、最后重启apache。当您用浏览器访问时,请注意您的浏览器版本是否支持SNI功能呢,请查阅 支持SNI的浏览器
要实现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
安全套接层 ( Secure
SSL采用公开密钥技术,保证两个应用间通信的保密性和可靠性,使客户與服务器应用之间的通信不被攻击者窃听。它在服务器和客户机两端可同时被支持,目前已成为互联网上保密通讯的工业标准。现行的Web浏览器亦普遍将HTTP和SSL相结合,从而实现安全通信,即我们所说的HTTPS。
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL
SSL已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输.它位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头
握手协议是客户机和服务器用SSL连接通信时使用的第一个子协议,握手协议包括客户机与服务器之间的一系列消息。SSL中最复杂的协议就是握手协议。该协议允许服务器和客户机相互验证,协商加密和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。握手协议是在应用程序的数据传输之前使用的。下图为HTTPS握手的过程:
阶段Ⅰ:建立安全能力
启动逻辑连接,建立这个连接的安全能力。首先客户机向服务器发出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连接提供两个服务:
(1)保密性:使用握手协议定义的秘密密钥实现
(2)完整性:握手协议定义了MAC,用于保证消息完整性
关于数字证书原理的可以查看: http://blog.csdn.net/jiangtongcn/article/details/13015071
当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上。