您的位置:首页 > 运维架构 > Apache

构建SSL/TLS安全的基于域名的apache虚拟主机

2009-09-21 16:51 851 查看
由于SSL协议的固有特性,apache下基于主机名的SSL虚拟主机一直不怎么好弄。
后来出了RFC3546标准中Server Name Indication(SNI)解决方案,终于有标准可循。问题是OpenSSL 0.9.8并不支持SNI(貌似0.9.8i支持),幸好还有mod_gnutls支持。

mod_gnutls基于gnutls, 与mod_ssl与openssl关系类似, 同样提供SSL和TLS的支持--起码在我眼中是一样的,不知道理解得对不对了。

要实现apache下基于主机名的安全虚拟主机,与下面的几方面知识内容有关:

1.apache下基于主机名的虚拟主机的配置
这个就不多说了,资料一抓大把。
 
2.gnutls和mod_gnutls安装
版本要求:
    Gnutls >= 2.4.0
    Apache httpd >= 2.15 (mod_gnutls主页的提示)
其实安装过程也没什么好说的,不外乎就是./configure和make && make install之类的,唯一要注意是,./configure时要注意缺少哪些包,然后下载安装相关的linux包。

比如RHEL5/CentOS5, 仓库中只有gnutls-1.4.1, 明显不符合要求,需要自行编译,这时就要安装httpd-devel等各个开发包以支持gnutls和mod_gnutls模块的编译了。 手工编译安装的mod_gnutls还要注意修改apache配置文件在443端口上进行监听。

对于debian lenny就方便得多,唯一要注意的是不要与mod_ssl一起用.
直接用下面的命令:
#a2dismod ssl
#apt-get install gnutls-bin libgnutls26 libapache2-mod-gnutls
#a2enmod gnutls
就能把需要的模块全部装好和配置好。

3.证书的创建
  debian: mkdir /etc/apache2/CA && cd /etc/apache2/CA
  RHEL:   mkdir /etc/httpd/CA && cd /etc/httpd/CA
SSL证书的创建也是比较复杂和繁琐的事,特别是对于我们这类对SSL/TLS并不是精通的人,幸好gnutls提供的工具和使用方法还是比较简单的:
1.创建CA的key(私钥)
  certtool --generate-privkey --outfile ca.key

2.创建CA的cert(证书)
  certtool --generate-self-signed \
           --load-privkey ca.key \
           --template ca.info \
           --outfile ca.cert
  注:
  --template ca.info指定了ca.info文件作为参数文件,可以避免交换过程回答程序的提问,内容和说明如下:(分隔线之间,实际使用时请自行去掉说明内容)
-----------------ca.info------------------
organization = "XXXXX Ltd."  //组织
unit = "XXXXX"               //组织单元
locality = "mycity"        //城市 --可选
state = "mystate"          //省份 --可选
country = CN               //国家 --可选
cn = "XXXX CA"             //通用名
ca                         //不要改
cert_signing_key           //不要改
expiration_days = 36500    //有效天数
-------------------------------------------

3.创建主机的key(私钥)
  certtool --generate-privkey --outfile www.HOSTNAME.com.key

4.创建主机的cert(证书)
  certtool --generate-certificate \
           --load-privkey www.HOSTNAME.com.key \
           --load-ca-certificate ca.cert \
           --load-ca-privkey ca.key \
           --template www.HOSTNAME.com.info \
           --outfile www.HOSTNAME.com.cert
  注:www.HOSTNAME.com.info意义同上,内容如下
--------www.HOSTNAME.com.info--------------
organization = "XXXX Ltd."
unit = "XXXXX"
cn = "www.HOSTNAME.com" //这里要与实际主机名一致,减少一个警告
tls_www_server
encryption_key
signing_key
expiration_days = 7300
-------------------------------------------

5.检验生成的cert证书文件
   certtool  -i --infile ca.cert
   certtool  -i --infile www.HOSTNAME.com.cert
注:上面3.4两步可以反复进行创建多个不同主机名的证书,用在虚拟主机配置中

4.配置apache
这里假设基于主机名的虚拟主机已配置好,以下面的配置示例:
NameVirtualHost *:443<VirtualHost *:443>
        GnuTLSEnable on
        GnuTLSPriorities NORMAL
        GnuTLSCacheTimeout 300
        GnuTLSCertificateFile CA/www.HOSTNAME.com.cert
        GnuTLSKeyFile CA/www.HOSTNAME.com..key

        ServerAdmin webmaster@localhost
        ServerName www.HOSTNAME.com.
        DocumentRoot /var/www-sites/xxxxxxxxxxxx/
</VirtualHost>
<VirtualHost *:443>
        GnuTLSEnable on
        GnuTLSPriorities NORMAL
        GnuTLSCacheTimeout 300
        GnuTLSCertificateFile CA/www.HOSTNAME2.com.cert
        GnuTLSKeyFile CA/www.HOSTNAME2.com..key

        ServerAdmin webmaster@localhost
        ServerName www.HOSTNAME2.com.
        DocumentRoot /var/www-sites/xxxxxxxxxxxx2/
</VirtualHost>如果有多个SSL主机, 则要配置多段VirtualHost内容,使用不同的cert和key

使用:
   因为是自签名证书,所以浏览器中仍然会提示"使用了无效的安全证书,该证书因为其发行者证书未知而不被信任"之类的错误信息,并要求浏览者确认后才继续浏览。
   要避免这个问题,可以购买商业认证(CA)或者寻找免费的第三方认证提供商发行的证书,然后重新生成主机的证书。
   事实上,虽然自签名证书有认证方面的问题,但完全不影响在通讯过程中的加密功能,起码企业内部是可以放心使用的。

参考资料:

gnutls主页 http://www.gnu.org/software/gnutls/
mod_gnutls主页
http://www.outoforder.cc/projects/apache/mod_gnutls/

这个比较清晰(关于证书创建) http://vpsblog.rashost.com/blog/openssl-ca-cert
这个比较完整也清楚,可惜站点离线了 http://moya.iyard.org/bin/view/Technology/Mod_gnuTLS 访问google快照 http://203.208.37.132/search?q=cache:1LXApSXcJuYJ:moya.iyard.org/bin/view/Technology/Mod_gnuTLS+mod_gnutls+%E8%AF%81%E4%B9%A6&cd=3&hl=zh-CN&ct=clnk&gl=cn&client=firefox-a&st_usg=ALhdy2_dcSb3Irb-VGjKNpg36p05uatImA
这里对gnutls的使用说明比较详细,不过有点乱,备用参考吧 http://hi.baidu.com/tiger_tnt/blog/item/22605b246494f2054c088d07.html
这里对mod_gnutls的实例描述得比较清楚 http://www.itis.tw/node/851
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  apache host https ssl named