Postfix的传输层安全协议(TLS)(1)


Postfix对于tls得支持,由lutz janicke所写得一组修补文件提供。从postfix主页得add-on software链接处可以取得这组修补文件。如果你使用平台随附得预编译版postfix包,请确定该版本确实包含tls patch。

除 了postfix本身要支持tls之外,你还必须制作、设定tls证书。你需要一个公钥(public key)与一个私钥(private key)。公钥是代表服务器身份得证书,你必须向具有一定信誉得认证中心(certificate authority,ca)提出申请,他们依据你得申请书向你求证之后,会以他们自己得数字签名签署一个公钥给你,只要客户端愿意相信ca得签名,就等于 间接相信ca核发得公钥所证明得系统--你得服务器。除了你自己的证书外,你还必须取得ca的公钥(核发证书给你的那一家ca)。

对电子交易而 言,让买方能够证明卖方身份是很重要的。因此,网络交易商确实有必要花钱取得ca的签名。然而,就保密通信而言,服务器公钥是否来自有公信力的ca,并不 是绝对必要的事,这表示你可以自己扮演ca的角色,自己核发证书给自己。当客户端mua连接到你的tls server时,如果不认识你使用的ca证书,mua通常会提供一个机会给用户,让用户自己决定要不要相信这个ca以及是否将ca的证书纳入认同名单中。

tls证书

postfix tls patch需要用到openssl函数库。openssl包随附了一组管理证书的命令行工具,你可用这些工具来制作证书。就postfix而言,所有证书 都必须是pem格式。openssl工具的默认输出格式刚好就是pem,所以不用任何转换就可产生postfix可用的证书。openssl工具的默认安 装目录位于/usr/local/ssl,管理证书所需的命令行工具是openssl。

自己开设认证中心

服务器端证书必须要经过ca的签署才有效。你可以付费请有公信力的ca为你签署,不过,就保密用途而言,你并不需要花这笔钱。openssl包提供了一个脚本,让你可以自己开设ca,自己签署自己的证书。在openssl的安装目录下,键入下列命令:

misc/ca.pl -newca

然后回答所有问题,完成之后,它会在./democa/目录下产生开设ca所需的全部文件,其中包括可用来签署证书的“ca数字签名”(又称为“根证书”)

tls证书概述

tls 使用公钥加密技术,让client/server之间能够进行私密通信。此外,tls能保证没有人能够在传输中途篡改信息,或是冒名伪装成某一方,因为协 议本身容许通信双方相互验证彼此的身份。然而,再次提醒tls的好处仅限于tls联机两端,至于数据在传输之前发生过什么事,以及在传输到目的地之后会被 怎样处理,tls都无法保证。

公钥加密技术的原理,是运用一对互补的key,其中一个可以公开给众人知道,称为“公钥”;而另ygie key则只能由个人拥有,决不可泄漏,所以称为“私钥”或“密钥”。公钥加密的数据,只可由私钥予以解密,反之亦然。利用这种特性,公钥可用来让别人传输 私密数据给你,而你可用私钥来证明自己的身份。当别人要传递机密数据给你时,对方可使用你事先提供的公钥来加密数据,由于只能用你自己的私钥予以解密,所 以不怕机密数据泄漏(除非你泄露自己的私钥)。私钥又如何用来证明自己的身份?你可用自己的私钥加密一份数据(这动作称为“签名”),如果对方能用你的公 钥解开,表示数据一定来自于你,不可能是别人(除非你把自己的密钥泄露给别人)。因此,你的密钥可视为你个人的数字签名。一般而言,你应该尽可能将公钥散 布出去,而密钥则必须不及一切代价予以保护。

当你收到别人的公钥时,你如何能够相信,公钥的拥有者确实是对方所宣称的那个人?实际上,公钥散布 时,往往会同时散布一个代表公钥拥有者的标识符--通常是服务器的主机名称。收到公钥的一方,可通过比对此标识符是否与dns查出的主机名称吻合,借此确 认公钥的拥有者确实是当前的联机对象。

有ca数字签名,称为证书。ca通常是交易双方都信任的第三方组织。理论上,有ca的证明,表示公钥拥有者 的身份已经被ca调查并予以证实,取得公钥的人,可以相信该公钥确实属于其宣称的拥有者。换言之,证书的授信基础来自于你对ca的信任。值得注意的是, ca只担保证书拥有者的身份,而不是担保其信用。

在加密通信的过程中,公私钥仅用于联机初期,让双方互相确定对方的身份,并协商出一个随机产生的 session key,实质的通信内容,其实是由这个session key来加密与解密。一个session key只用於一次通信,在通信完毕之后,session key就可以丢掉了。

让我们看看client与server之间是如何进行秘密通信的。首先,client联机到server,并提出秘密通信要求。对于web server,client使用https命令;对于smtp server,client发出starttls命令。

如 果server同意请求,便会返回一个由ca签署的证书,其中含有ca的数字签名以及一个代表server的标识符。client检验server的标识 符是否符合预期,并检查该ca的数字签名是否在认同名单中。如果两项检查都过关,client与server双方便开始展开session key协商,决定后续通信内容要使用哪一种加密算法,并产生一个只用於该次通信的session key。接着,双方便使用协议出来的session key与算法进行秘密通信。

产生服务器端证书

产生服务器端证书的第一步,是使用openssl工具为服务器产生一对公钥与私钥, 然后产生一个“证书签署请求”(certificate signing request, csr),并将csr与公钥交给ca签署。经过ca签署的公钥证书可以广泛散布出去,但是私钥则必须被谨慎保管。事实上,有许多应用系统将私钥加密封存在 一个特殊文件,在访问私钥之前,必须先提供密码(passphrase)才能解密,这种储存私钥的方法称为“密封”。然而,postfix需要能够直接访 问私钥,不能使用密封方法,因为访问私钥的动作发生在运行时,而此时你不可能实时提供密码。

openssl包提供一组脚本可帮助你产生公私钥与csr,不过,它们所产生的key是“密封”的,所以,你得直接使用openssl命令来产生公私钥:

openssl req -new -nodes -keyout mailken.pem -out mailreq.pem -days 365

openssl得-new选项表示你想产生公私钥与csr,-nodes选项表示不加密,-keyout和-out分别指出私钥文件与csr文件得名称。最后,-days 365指出证书得有效期限是一年。

如果你使用第三方ca,请按照ca得指示,提出你得csr来要求他们签署。如果你自己扮演ca得角色,你可用下列命令来核发证书:

openssl ca -out mail_signed_cert.pem -lnfiles mailreq.pem

此步骤所产生得mail_signed_cert.pem文件,就是ca所核发得证书。

你可能会想要将postfix/tls用到得所有证书文件复制到一个方便得位置。假设你完全依照上述得步骤,则请用下列命令将证书文件复制到postfix的配置目录下:

cp /usr/local/ssl/mailkey.pem /etc/postfix

cp /usr/local/ssl/mail_signet_cert.pem /etc/postfix

mailkey.pem文件存有服务器的密钥,mail_signed_cert.pem是ca签署的公开证书。由于postfix不能使用密封的私钥文件,所以你应该以最严格的权限模式来保护私钥文件:

chown root /etc/postfix/mailkey.pem

chmod 400 /etc/postfix/mailkey.pem

上述命令将私钥文件的拥有权判给root账户,而且只有root能够读取。

安装ca证书

postfix/tls server必须要能够访问ca的公开证书(也就是所谓的“根证书”),包括为你的服务器签名的那一个ca以及核发证书给你的用户的每一个ca。当然,如果双方使用同一个ca,则只需要安装一个根证书就够了。

如果你的服务器端证书是自己签发给自己的,请将先前的ca.pl脚本所产生的cacert.pem文件复制到postfix的配置目录:

cp /usr/local/ssl/democa/cacert.pem /etc/postfix

如果你的服务器或任何客户端的证书是第三方ca所签发的,你必须设法取得这些ca的根证书(pem格式);对于你不信任的ca,自然没必要取得他们的根证书。请将搜集到的所有根证书集中在/etc/postfix/cacert.pem文件里。

有 两种方法可将新的ca根证书安装到postfix/tls系统。第一种办法是将所有根证书集中在一个文件,并将smtpd_tls_cafile参数指向 此文件。你只需将新的根证书附加在现有文件末端即可。比方说,若原有的ca根证书是存储在/etc/postfix/cacert.pem文件中,而新 ca的根证书是存放在newca.pem文件中,那么,下列命令可将新的根证书纳入认同名单:

cp /etc/postfix/cacert.pem /etc/postfix/cacert.pem.old

cat newca.pem >> /etc/postfix/cacert.pem

另一种方法是将每个ca的根证书全部集中一个专用目录下的个别文件里,并将smtpd_tls_capath参数指向此目录。以后,每当需要安装新的ca根证书时,只要将新的证书文件存放在此目录下,然后执行一次openssl的c_rehash命令即可。

当你有许多ca根证书要处理时,这种方法可让维护工作稍微轻松些;不过,如果你的postfix是在chroot环境下运行,则还需要将新的根证书文件复制到chroot环境下的对应目录,然后运行postfix reload,新证书才会有效。

设定postfix/tls

postfix tls patch引进了一组关于tls运作环境的参数。本小节只列出基本配置所需的关键参数,至于完整的tls参数说明,请参阅tls patch随附的配置文件样本。

smtpd_use_tls

启动tls支持。如果没有设定此参数或是设定成no,postfix的运行方式就像没有tls patch一样。例如:

smtpd_use_tls = yes

smtpd_tls_key_file

指向服务器私钥文件。例如:

smtpd_tls-key_file = /etc/postfix/mailkey.pem

smtpd_tls_cert_file

指向服务器的pem证书文件(必须经过ca签署)。例如:

smtpd_tls_cert_file = /etc/postfix/mail_signed_cert.pem

smtpd_tls_cafile

指向ca根证书文件。该文件含有所有你愿意信任的ca的公开证书。例如:

smtpd_tls_cafile = /etc/postfix/cacert.pem

smtpd_tls_capath

指向ca根证书文件目录。该目录下的每个pem文件,都含有一个你信任的ca公开证书。例如:

smtpd_tls_capath = /etc/postfix/certs

将上述参数设定到main.cf配置文件,并运行postfix reload之后,你的postfix/tls server将具备秘密通信的能力,并准备迎接客户端的starttls命令。


相关内容