apache中使用mod_gnutls模块实现多个SSL站点配置(亲测可用)

在apache的环境下该如何配置多个HTTPS虚拟主机呢?利用的原理的都是同一个,也就是SNI。基于域名的虚拟主机,即共享同一个IP地址和端口的HTTPS虚拟主机。

SNI—服务器名称指示,是一个TLS的扩展,它使得启用SSL的基于域名的虚拟主机的配置成为可能。打破了每个HTTPS的虚拟主机需要一个IP地址的要求。因此,成本大大降低,因为所有的HTTPS虚拟主机可以共享相同的IP地址和端口,使HTTPS Web服务的更简单。

在apache环境下,需要使用mod_gnutls来实现同一个IP上配置多个HTTPS主机。

1. 安装mod_gnutls

1
2
3
4
5
6
# yum install httpd-devel gnutls-devel gnutls-utils
# tar -xjvf mod_gnutls-0.2.0.tar.bz2
# cd mod_gnutls-0.2.0
# ./configure --prefix=/usr
# make

如果要安装高版本的gnutls的话,需要先安装相对应的依赖包libnettle gmplib。下载地址:http://www.gnutls.org/download.html  ftp://ftp.gnutls.org/gcrypt/gnutls
mod_gnutls模块依赖dhfile和rsafile文件.

然后把安装目录底下的文件拷贝到对应httpd的modules文件夹

1
# cp mod_gnutls-0.2.0/src/.libs/libmod_gnutls.so /alidata/server/httpd-2.2.27/modules/mod_gnutls.so

创建回话缓存目录

1
2
# mkdir -m 0700 /var/cache/mod_gnutls_cache
# chown -R www.www /var/cache/mod_gnutls_cache

配置httpd.conf

只需要删除#Include conf/extra/httpd-ssl.conf前面的井号,也是取消注释

httpd-ssl.conf里面的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Listen 443
NameVirtualHost *:443  #这个就是使基于域名的虚拟主机起作用
SSLStrictSNIVHostCheck off  #这个很重要,前面就是因为没有配置这个,导致一直失败,变成一个IP,一个端口只能绑定一张证书
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
SSLSessionCache dbm:/var/cache/mod_gnutls_cache
SSLSessionCacheTimeout  300
SSLMutex  "file:/alidata/server/httpd/logs/ssl_mutex"
<VirtualHost *:443>
    ServerName www.699y.com:443
    SSLEngine on
    SSLCertificateFile "/alidata/server/httpd-2.2.27/conf/699y/public.pem"
    SSLCertificateKeyFile "/alidata/server/httpd-2.2.27/conf/699y/214150483160537.key"
    DocumentRoot "/alidata/www/default/699y/"
</VirtualHost>
<VirtualHost *:443>
    ServerName www.zhuangjinhui.cn:443
    SSLEngine on
    SSLCertificateFile "/alidata/server/httpd-2.2.27/conf/zhuang/public.pem"
    SSLCertificateKeyFile "/alidata/server/httpd-2.2.27/conf/zhuang/214150483170537.key"
    DocumentRoot "/alidata/www/default/zhuang/"
</VirtualHost>

然后重启下apache服务,应该就可以直接用https访问了
如果想要把80端口的直接301到https上面的话,可以直接在网站根目录底下创建.htaccess进行跳转

1
2
3
4
RewriteEngine on
RewriteBase /
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]