26.6. 使用 SSL 设置安全性万维网服务器

只要在万维网服务器和客户机之间传送诸如信用卡数据之类的敏感数据,那么就需要带有鉴定的安全加密连接。mod_ssl 将使用安全套接层 (SSL) 和传输层安全 (TLS) 协议为客户机和万维网服务器之间的 HTTP 通信提供强大的加密功能。使用 SSL/TSL 时,将在万维网服务器和客户机之间建立专用连接。能够确保数据完整性,并且客户机和服务器能够彼此鉴定。

基于此目的,服务器在回答对 URL 的任何请求之前,会发送一个 SSL 证书,其中包含证明服务器有效身份的信息。反过来,这保证了该服务器对于通信来说是唯一正确的终端。此外,证书使得在客户机和服务器之间建立起加密连接,确保在不泄露敏感的明文内容的情况下传输信息。

mod_ssl 不实施 SSL/TSL 协议本身,而是充当 Apache 和 SSL 库之间的接口。在 SUSE Linux 中,将使用 OpenSSL 库。OpenSSL 将自动随 Apache 安装。

将 mod_ssl 与 Apache 一起使用的最明显效果就是 URL 的前缀为 https://(而不是 http://)。

26.6.1. 创建 SSL 证书

为了将 SSL/TSL 与万维网服务器一起使用,需要创建 SSL 证书。在万维网服务器和客户机之间授权时需要此证书,所以每一方都能明确地识别其它方。为了确保证书的完整性,证书必须由所有用户都信任的一方签署。

可以创建的证书有三类:“虚拟”证书(仅用于测试)、自签署证书(用于信任您的指定用户群)和由独立的、广为人知的证书授权者 (CA) 签署的证书。

创建证书一般分为两步。首先,生成证书授权者的私用密钥,然后使用此密钥签署服务器证书。

[Tip]参见信息

要想更多地了解 SSL/TSL 的概念和定义,请参见 http://httpd.apache.org/docs/2.2/ssl/ssl_intro.html

26.6.1.1. 创建“虚拟”证书

虚拟证书的生成非常简单。只需调用脚本 /usr/bin/gensslcert 即可。它将创建或覆盖以下文件:

  • /etc/apache2/ssl.crt/ca.crt

  • /etc/apache2/ssl.crt/server.crt

  • /etc/apache2/ssl.key/server.key

  • /etc/apache2/ssl.csr/server.csr

还会将 ca.crt 的副本放在 /srv/www/htdocs/CA.crt 下以供下载。

[Important]重要

不能在生产系统上使用虚拟证书。它只能用来测试。

26.6.1.2. 创建自签署证书

如果要为内部网或指定用户群设置安全的万维网服务器,则只需通过您自己的证书授权者 (CA) 来签署证书即可。

创建自签署证书由 9 个交互的步骤组成。更改为目录 /usr/share/doc/packages/apache2,然后运行以下命令:./mkcert.sh make --no-print-directory /usr/bin/openssl /usr/sbin/ custom。请勿从此目录外运行该命令。程序将提供一系列的提示,其中一部分需要用户输入。

过程 26.1. 使用 mkcert.sh 创建自签署的证书

  1. 决定用于证书的签名算法

    选择 RSA(R,默认值),因为一些旧的浏览器在使用 DSA 时存在问题。

  2. 生成 CA 的 RSA 私用密钥(1024 位)

    不需要交互。

  3. 生成 CA 的 X.509 证书签署请求

    在此处创建 CA 的判别名。这要求您回答几个问题,比如国家/地区名称或组织名称。输入有效数据,因为在此处输入的内容稍后会显示在证书中。无需回答所有问题。如果问题不适合您或者您不想回答,则请使用“.”。常用名就是 CA,请选择一个重要的名称,例如我的公司 CA。

  4. 为自签署的 CA 生成 X.509 证书

    选择证书版本 3(默认值)。

  5. 生成 SERVER 的 RSA 私用密钥(1024 位)

    不需要交互。

  6. 生成 SERVER 的 X.509 证书签署请求

    为此处的服务器密钥创建判别名。问题与 CA 判别名的问题几乎相同。在此处输入的数据适用于万维网服务器,而且可以与 CA 的数据不同。(例如,如果服务器在其它地方)

    [Important]选择常用名

    在此处输入的常用名必须是安全服务器的全限定主机名(例如,www.example.com)。否则,在访问万维网服务器时,浏览器将发出一条警告,指示在证书与服务器不匹配。

  7. 生成由 CA 签署的 X.509 证书

    选择证书版本 3(默认值)。

  8. 使用安全性通行密码加密 CA 的 RSA 私用密钥

    强烈建议使用密码加密 CA 的私用密钥,所以请选择 Y 并输入一个密码。

  9. 使用安全性通行密码加密 SERVER 的 RSA 私用密钥

    使用密码加密服务器密钥要求您在每次启动万维网服务器时输入此密码。这对于在引导时自动启动服务器或重启动万维网服务器有点困难。因此,通常在回答此问题时选择 N。要了解在没有使用密码加密时您的密钥是不受保护的,并且保证只有授权个人才有权访问此密钥。

    [Important]加密服务器密钥

    如果选择使用密码加密服务器密钥,则请在 /etc/sysconfig/apache2 中增加 APACHE_TIMEOUT 的值。否则,在启动之前您没有足够的时间输入通行密码,这样服务器将无法停止。

脚本结果页面上将出现一个存储它已经生成的证书和密钥的列表。与脚本输出结果不同的是,文件没有在本地目录 conf 中生成,而是在 /etc/apache2/ 下的适当位置处生成。

最后一步就是将 CA 证书文件从 /etc/apache2/ssl.crt/ca.crt 复制到用户可以访问的位置,从而将它合并到万维网浏览器中已知、可信的 CA 的列表中。否则,浏览器将指示证书是由未知授权者发出的。证书的有效期为 1 年。

[Important]自签署证书

仅在万维网服务器上使用自签署证书,此证书必须可由知道并相信您是证书授权者的人员访问。不建议在公共商店使用此类证书。

26.6.1.3. 获取正式签署的证书

签署证书的正式证书授权者有很多。证书是由值得信任的第三方签署的,所以可以完全相信。公共操作安全万维网服务器通常具有正式签署的证书。

最常见的正式 CA 是 Thawte (http://www.thawte.com/) 或 Verisign (www.verisign.com)。这些 CA 以及其它 CA 已合并到所有浏览器中,所以由这些证书授权者签署的证书将被浏览器自动接受。

请求正式签署的证书时,无需向 CA 发送证书。相反,请发出证书签署请求 (CSR)。要创建 CSR,请调用脚本 /usr/share/ssl/misc/CA.sh -newreq

首先,脚本将询问加密 CSR 的密码。然后,会要求您输入判别名。这要求您回答几个问题,比如国家/地区名称或组织名称。输入有效的数据,在此处输入的所有内容稍后都会显示在证书中并检查。无需回答所有问题。如果问题不适合您或者您不想回答,则请使用“.”。常用名就是 CA,请选择一个重要的名称,例如我的公司 CA。最后,必须输入询问密码和备用的公司名称。

在调用脚本的目录中查找 CSR。文件名是 newreq.pem

26.6.2. 使用 SSL 配置 Apache

万维网服务器端的 SSL 和 TLS 请求的默认端口是 443。在端口 80 上的“常规” Apache 监听和端口 443 上支持 SSL/TLS 的 Apache 监听之间没有冲突。事实上,HTTP 和 HTTPS 可以使用相同的 Apache 实例运行。通常使用一个虚拟主机将请求发送到端口 80 和端口 443 以区分虚拟服务器。

[Important]防火墙配置

记住在端口 443 上为支持 SSL 的 Apache 打开防火墙。可以按第 4.1.4.1 节 “使用 YaST 配置”中的描述使用 YaST 来完成此操作。

要使用 SSL,必须在全局服务器配置中激活它。在编辑器中打开 /etc/sysconfig/apache2,然后搜索 APACHE_MODULES。如果“ssl”不存在,则将它添加到模块的列表中(mod_ssl 在默认情况下是激活的)。下一步,请搜索 APACHE_SERVER_FLAGS 和“SSL”。如果打算使用密码加密服务器证书,则还应该增加 APACHE_TIMEOUT 的值,这样在 Apache 启动时,您就有足够的时间输入通行密码。重启动服务器可使这些更改生效。仅重装载是不够的。

虚拟主机配置目录中包含模板 /etc/apache2/vhosts.d/vhost-ssl.template,该模板带有详细记录的特定于 SSL 的指令。请参见第 26.2.1.2 节 “虚拟主机配置”了解通用虚拟主机配置。

要开始,只需调整以下指令的值即可:

  • DocumentRoot

  • ServerName

  • ServerAdmin

  • ErrorLog

  • TransferLog

[Important]基于名称的虚拟主机和 SSL

用户不能在仅具有一个 IP 地址的服务器上运行多个支持 SSL 的虚拟主机。连接到此类设置的用户会在每次访问 URL 时接收到警告讯息,指出证书与服务器名称不匹配。每个支持 SSL 的域需要单独的 IP 地址或端口,才能实现基于有效 SSL 证书的通信。