SSL(Secure Socket Layer)是一种在让可持有证书的浏览器软件(比如Internet Explorer、Netacpe Navigator)和WWW服务器(如Netscape的Netscape Enterprise Server 、ColdFusion Server等等)之间构造的安全通道中传输数据的协议,他运行在TCP/IP层之上、应用层之下,为应用程序提供加密数据通道。
Apache,众所周知,是UNIX世界最为流行的WWW服务器软件,性能好,可扩展性强。同时他也有相应的Win32版本。
在访问一些网站时,我们会注意到它的URL不是一般的HTTP://aa.bb.cc ,而是https://aa.bb.cc 这表明网站提供了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使用的端口。
· 浏览一下
然后在浏览器里面输入http://server server是你的服务器的IP地址,然后会出现以下的字样:
Hey, it worked !
The SSL/TLS-aware Apache webserver wassuccessfully installed on this website.
然后同样的试试https://server, 应该也有同样的字眼。
· 获取一个证书
下面描述的是怎样产生自己的一个测试性证书。这个证书不能公开使用,但是怎样获得一个可以公开使用的证书就不在本文所讲述的范围了。
利用下列命令得到一个测试证书
# 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了,那么也可以取消它。可以参阅http://www.modssl.org/docs/2.7/ssl_faq.html#ToC31 然而取消passphrase会有一些安全问题,上面的url里面也提到了,可以根据需要来斟酌。
· 确认安全问题
为了确认我的https连接确实是被经过加密的,于是在Netscape里面我查阅了View-->Page Info,里面有下列字样:
所以https连接确实是加密的。
· 笔者遇到的问题
当我试图在Netscape 4.74里面访问https://server时,下面的对话框冒了出来: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