爱心技术专栏专题

在FreeBSD上配置Apache+SSL

摘录:Apache 来源:Apache 加入时间:2007年04月12日
摘要:
在FreeBSD上配置Apache+SSL
 


        
    作者:刘稳 



    文章摘要:
      本文就开始就Apache+mod_ssl on FreeBSD进行讨论。



      SSL(Secure Socket La…

在FreeBSD上配置Apache+SSL

站点:爱心种子小博士 关键字: 在FreeBSD上配置Apache+S

在FreeBSD上配置Apache+SSL 


        
    作者:刘稳 



    文章摘要:
      本文就开始就Apache+mod_ssl on FreeBSD进行讨论。



      SSL(Secure Socket Layer)是一种在让可持有证书的浏览器软件(比如Internet Explorer、Netacpe Navigator)和WWW服务器(如Netscape的Netscape Enterprise Server 、ColdFusion Server等等)之间构造的安全通道中传输数据的协议,他运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道。
      Apache,众所周知,是UNIX世界最为流行的WWW服务器软件,性能好,可扩展性强。同时他也有相应的Win32版本。
      在访问一些网站时,我们会注意到它的URL不是一般的 ,而是 这表明网站提供了HTTPS连接功能,即SSL over HTTP. 这保证了客户端与服务器的通信都是在SSL建立的加密通道中进行,绝对安全。为了让Apache服务器支持https,那么就必须配置mod_ssl模块。下文就开始就Apache+mod_ssl on FreeBSD进行讨论。

    配置Apache服务器

      首先,如果您的FreeBSD系统已经配置好Apache服务器,那么最好先备份一下,起码要把Apache的配置文件作一备份。如果需要直接往现有的安装上配置SSL支持,请阅读文章的最后一部分。
      · 安装port
      port的安装非常方便,由于笔者已经安装好了所有的port 框架,所以只需要 cd /usr/ports/www/apache13-modssl make install
      这样就安装好了Apache的二进制文件,但是这还不够。
      · Apache以什么方式运行?
      比如,笔者需要Apache以www用户组的www用户运行(这也是出于安全性考虑)。如果发现针对apache的入侵,那么这只是针对这个组/用户的。所以还是推荐这样配置用户。
    可以用adduser命令添加用户,也可以直接vipw,添加:
    www:*:99:99::0:0:apache Daemon:/nonexistent:/sbin/nologin
    同时需要添加www组,在/etc/group里面添加一行
    www:*:99
      · 配置文件
    以下都需要在apache的配置文件中进行改变。缺省条件下,它是/usr/local/etc/apache/apache.conf

      下列表格是笔者改动的一些设置



     
      · 测试配置
      配置好apache以后,运行# /usr/local/sbin/apachectl configtest Syntax OK
      表示已经工作正常
      · 启动和重起服务器
      现在,一切已经工作正常,可以启动apache服务器
      # /usr/local/sbin/apachectl startssl /usr/local/sbin/apachectl startssl: httpd started
      启动可能需要一些时间,因为需要产生随机数。
      如果你又做了一些配置上的改动,需要重起服务器,可以
      # /usr/local/sbin/apachectl graceful /usr/local/sbin/apachectl graceful: httpd gracefully restarted
      · 校错
      如果启动出现问题,那么最好去查阅log文件, 比如
      # tail apache_ssl_engine_log
      [notice] SIGUSR1 received. Doing graceful restart
    [notice] Apache/1.3.14 (Unix) mod_ssl/2.7.1 OpenSSL/0.9.4
    configured -- resuming normal operations
    然后,看看SSL引擎的log
    # tail apache_ssl_engine_log
    [info] Init: 1st restart round (already detached)
    [info] Init: Reinitializing OpenSSL library
    [info] Init: Seeding PRNG with 1160 bytes of entropy
    [info] Init: Configuring temporary RSA private keys (512/1024 bits)
    [info] Init: Configuring temporary DH parameters (512/1024 bits)
    [info] Init: Initializing (virtual) servers for SSL
    [info] Init: Configuring server new.host.name:443 for SSL protocol
    [warn] Init: (new.host.name:443) RSA server certificate CommonName
    (CN) `www.snakeoil.dom does NOT match server name!?
      问题就一幕了然了,其中snakeoil是安装的时候缺省的证书,以后会用我们自己的证书来代替之。
      · 别忘了自己的防火墙
      如果你的机器是在防火墙后面,别忘了让防火墙允许对443端口的访问,这就是https使用的端口。
      · 浏览一下
      然后在浏览器里面输入 server是你的服务器的IP地址,然后会出现以下的字样:
       Hey, it worked !
       The SSL/TLS-aware Apache webserver wassuccessfully installed on this website.
      然后同样的试试, 应该也有同样的字眼。
      · 获取一个证书
      下面描述的是怎样产生自己的一个测试性证书。这个证书不能公开使用,但是怎样获得一个可以公开使用的证书就不在本文所讲述的范围了。
      利用下列命令得到一个测试证书
      # cd /usr/ports/www/apache13-modssl
      # make certificate
      笔者已经改动了所能够看懂的所有名称,其他的都跟缺省的相同,然后会在下列目录产生一个证书文件
    /usr/ports/www/apache13-modssl/work/apache_1.3.14/conf
      应该可以找到两个子目录,ssl.crt和ssl.key。这些目录需要拷贝到apache的根目录,但是之前笔者还是对原来的文件做了一个备份。
    # cd /usr/local/etc/apache
    # mv ssl.crt ssl.crt-default
    # mv ssl.key ssl.key-default
      然后把刚才生成的文件拷贝过去
    # cd /usr/ports/www/apache13-modssl/work/apache_1.3.14/conf
    # cp -rp ssl.key /usr/local/etc/apache
    # cp -rp ssl.crt /usr/local/etc/apache
      然后就需要重起apache,但是笔者刚开始用的是graceful restart,但是没能读取新的证书。于是就做了stop然后start.下面是屏幕输出
    # /usr/local/sbin/apachectl startssl
    Apache/1.3.14 mod_ssl/2.7.1 (Pass Phrase Dialog)
    Some of your private key files are encrypted for security reasons.
    In order to read them you have to provide us with the pass phrases.

    Server new.host.name:443 (RSA)
    Enter pass phrase:

    Ok: Pass Phrase Dialog successful.
    /usr/local/sbin/apachectl startssl: httpd started
      这样就好了。同时笔者还在生成证书的时候加上了一个passphrase。WWW服务器启动的时候需要它。
      · 取消passphrase
    如果后来你有不想要passhprase了,那么也可以取消它。可以参阅 然而取消passphrase会有一些安全问题,上面的url里面也提到了,可以根据需要来斟酌。
      · 确认安全问题
      为了确认我的https连接确实是被经过加密的,于是在Netscape里面我查阅了View-->Page Info,里面有下列字样:
    Security:This is secure document that uses a high-grade encryption key for U.S.domestic use only(RC4,128bit).
      
      所以https连接确实是加密的。
      · 笔者遇到的问题
      当我试图在Netscape 4.74里面访问时,下面的对话框冒了出来:When I tried to browse to the website from Netscape 4.74, I was created with the following message box:
    SSL has recieved an error from the server indicating an incorrect Message Authentication Code. This could indicate a network error, a bad server implementation, or a security violation.
    然后在/var/log/apache_error_log发现了下面的错误:
    [error] mod_ssl: SSL handshake failed (server new.host.name:443,
    client 10.0.0.99) (OpenSSL library error follows)
    [error] OpenSSL: error:0407106B::lib(4) :func(113) :reason(107)
    [error] OpenSSL: error:04065072::lib(4) :func(101) :reason(114)
    [error] OpenSSL: error:1408F071::lib(20) :SSL3_GET_RECORD:bad
    mac decode [Hint: Browser still remembered details of a
    re-created server certificate?]
      而在IE5.5里面却没有问题,实在很令人困扰。更好笑的是,第二天用Netscape再次访问的时候却好了!我想大概是因为我重起了Netscape的进程,当没有重起的时候Netscape认为这是个新的证书,对自己不适用,重起以后就认得了(Netscape确实雄风不再,唉)。
      · 在已有的安装上配置ssl
      笔者开始时就尝试在已有的apache上安装SSL,按照以上的步骤。但是不幸的是,竟然把以前的apache也搞崩溃了。然后采取的办法就是:
      · 为配置文件作一备份
      · 卸载所有apache,ssl和php(从pkg_info的输出查看一下,然后用pkg_delete卸载)
      · 按照上面的步骤重新来过
      · 安装mod_php4


    发布人:netbull 来自:China-pub 

转载:转载请保留本信息,本文来自http://www.51dibs.com/lp07/la/a9/l_a_10ca66fe53590230.html