加密的一个简单但又实用的任务就是发送加密的电子邮件。多年来,为电子邮件进行加密的标准实际一直是PGP(Pretty Good Privacy)。Philip R.Zimmermann特别为电子邮件的保密编写了PGP。
我们可以获取PGP的免费版本,但是,需要注意的是,它并不是免费软件。这种免费版本只能供合法的非商业性机构和个人使用。
你可以从网站直接下载免费版本,或者从PGP公司购买一个商业许可证,请参阅如下网址获得详细信息:http://www.pgp.com
关于PGP产品的历史以及可用版本,请参阅Philip Zimmerman在http://www.philzimmermann.com/EN/findpgp/findpgp.html上发表的/"Where to Get PGP/"文章。
作为PGP的替代,如今已经有一个开放源代码的类似产品可供使用。GPG(Gnu Privacy Guard)将是PGP的免费替代品。它不包含专利的算法,能够无限制地应用于商业活动中。
这两种产品以相似的方式执行同样的任务。如果要使用命令行工具,它可能没问题,但是二者具有不同的接口,例如,公共电子邮件程序的插件接口,一旦收到电子邮件,它将自动解密电子邮件。
GPG能够从以下站点获得:http://www.gnupg.org
你可以同时使用这两种产品,使用GPG创建一个加密的消息,使用PGP(只要它是当前版本)对其进行解密。因为我们对于在Web服务器上创建消息很感兴趣,我们将在此给出一个GPG的例子。而如果使用PGP代替将不需要太多的变化。
与本书中例子的常规需求一样,需要获得能够让代码工作的GPG。系统中可能已经安装了GPG。但如果没有安装,也不用担心,因为安装过程非常简单,但设置GPG可能需要一点技巧。
18.6.1 安装GPG
要在Linux机器上添加GPG,需要从www.gnupg.org网站上下载适当的存档文件,并使用gunzip和tar命令从存档文档中提取文件。
要编译和安装程序,使用对大多数Linux来说都是相同的命令:
make
make install
configure(或者,./configure,这是因操作系统不同而各异)
如果不是root用户,需要使用带用--prefix选项的方式运行配置脚本,如下所示:
./configure--prefix=/path/to/your/directory
使用这个选项是因为一个非root用户将不能访问GPG的默认路径。
如果一切运行正常,GPG将被编译并复制到/usr/local/bin/gpg目录或者指定的路径。许多选项可以改变。详细信息请参阅GPG文档。
对于Windows服务器,这个过程是比较容易的。下载zip文件,解压缩它,将gpg.exe保存在PATH路径下(置于C:windows或者类似目录下是比较好的)。在C:gnupg下创建一个目录。开启命令提示符模式并输入gpg命令。
还需要安装GPG或者PGP,并在系统上生成用以检查邮件的密钥对。
在Web服务器上,GPG和PGP的命令行版本之间几乎没有什么区别,因此我们也可以免费使用。在读取邮件的机器上使用GPG,最好购买PGP的商业版本,以便向邮件读者在邮件阅读器中提供一个更好的图形用户界面插件。
如果还没有这样的插件,请在邮件客户端机器上生成一个密钥对。回忆一下,密钥对包含一个公有密钥和一个私有密钥,其他人(和PHP脚本)在发送邮件之前使用公有密钥对邮件内容进行加密,我们可以使用私有密钥解密收到的信息或者签名要发送的邮件。
请注意,应该在邮件客户端机器上生成密钥而不是在Web服务器上生成它,这是很重要的。同样,私有密钥也不应该存储在Web服务器上。
如果使用GPG的命令行版本生成密钥,输入如下命令:
gpg--gen-key
系统将询问许多问题。大多数问题都有一个可以接受的默认答案。在不同的问题下,系统将询问真实名字和电子邮件地址以及说明信息,这些信息将用于命名密钥。例如,我的密钥就被命名为/'Luke welling<[email protected]>/'。相信我们能够看懂此模式。如果给出了说明信息,那么说明信息将位于姓名和电子邮件地址之间。
要从新的密钥对输出公有密钥,可以使用如下所示命令:
gpg--export>filename
这将给出一个二进制文件,该文件适合将GPG或PGP密钥环导入到其他机器上。如果要将该密钥环以电子邮件的形式发送给人们,以便他们可以进入密钥环,那么可以建立一个ASCII版本来代替,如下所示:
gpg--export-a>filename
在已经获得公有密钥后,就能够将文件上传到Web服务器上自己的目录下。可以用FTP完成文件上传。
下面的命令是假定在UNIX环境下运行的。对于Windows系统来说,步骤也是一样的,但目录名和系统命令有所区别。首先,使用账户登录到Web服务器并更改文件的访问权根,以便其他用户能够阅读该文件。使用如下命令:
chmod 644 filename
我们需要创建一个密钥环,以便执行PHP脚本的用户能够使用GPG。具体哪些用户取决于服务器的设置。通常,该用户是/"nobody/",但也可能是其他用户。
要想成为Web服务器用户,需要有访问服务器的root权限才能实现。在许多系统中,Web服务器都是以/"nobody/"用户身份运行的。如下所示的例子也是这种情况(我们能够在系统上将其改变为适当的用户)。如果系统是这种情形,可以使用如下所示命令:
su root
su nobody
为/"nobody/"创建一个目录用来存储密钥环和GPG的其他配置信息。这需要在nobody用户的根目录下进行。
每个用户的根目录在/etc/passwd文件中指定。在许多Linux系统中,nobody用户的默认根目录为“/”,而nobody用户无权对该目录执行写操作。在许多BSD系统中,nobody用户的根目录默认为/nonexistent(不存在),也就是说该目录不存在,用户也就不能对其执行写操作。在我们的系统上,nobody用户根目录被指定为/tmp。需要确定Web服务器用户是否有一个他们可以写入的根目录。
使用如下所示命令:
cd~
mkdir.gnupg
nobody用户需要一个自己的签名密钥。要创建一个签名密钥,使用如下所示命令:
gpg--gen-key
由于nobody用户可能需要接收一些个人电子邮件,因此可以为他们创建一个签名密钥。这个密钥的唯一目的是让我们信任先前获得的公有密钥。
为了导入先前导出的公有密钥,可以使用如下所示的命令:
gpg--import filename
要告诉GPG我们希望信任这个密钥,需要使用如下所示命令编辑密钥的属性:
gpg--edit-key/'Luke Welling<[email protected]>/'
在以上代码中,引号内的文本是密钥的名称,显而易见,当生成它时,密钥的名称不是/'luke Welling<[email protected]>/',而是由名称、注释和所提供的E-mail地址组成的。
这个程序的命令选项还包括help,它描述了所有可供使用的命令,例如,trust、sign和save。
输入trust命令选项将告诉GPG应该完全信任自己的密钥。输入sign命令选项表示用nobody的私有密钥签名公有密钥,最后,输入save命令选项表示退出这个程序并保存更改。