14.10. OpenSSL

作者 Tom Rhodes.

许多用户可能并没有注意到 FreeBSD 所附带的 OpenSSL 工具包的功能。 OpenSSL 提供了建立在普通的通讯层基础上的加密传输层; 这些功能为许多网络应用和服务程序所广泛使用。

OpenSSL 的一些常见用法包括加密邮件客户的身份验证过程, 基于 Web 的交易如信用卡等等。 许多 ports 如 www/apache13-ssl, 以及 mail/sylpheed-claws 等等都提供了编译进 OpenSSL 支持的方法。

Note: 绝大多数情况下 ports collection 会试图使用 security/openssl 除非明确地将 WITH_OPENSSL_BASE make 变量设置为 “yes”。

FreeBSD 中附带的 OpenSSL 版本能够支持 安全套接字层 v2/v3 (SSLv2/SSLv3) 和 安全传输层 v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库用于应用程序。

Note: 尽管 OpenSSL 支持 IDEA 算法, 但由于美国专利, 它在默认情况下是不编译的。 如果想使用它, 请查阅相应的授权, 如果认为授权可以接受, 则可以在 make.conf 中设置 MAKE_IDEA

为应用软件创建和提供证书可能是 OpenSSL 最为常用的功能。 证书是一种确保公司或个人身份有效性的凭据。 如果证书没有被权威发证机构, 即 CA 验证, 则通常会收到一个警告。 权威发证机构是通过签署证书来证明个人或公司凭据有效性的公司, 如 VeriSign。 这个过程是需要收费的, 并且也不是使用证书时必须的工作; 不过, 这可以让那些比较偏执的用户感到轻松。

14.10.1. 生成证书

为了生成证书, 需要使用下面的命令:

# openssl req -new -nodes -out req.pem -keyout cert.pem
Generating a 1024 bit RSA private key
................++++++
.......................................++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:PA
Locality Name (eg, city) []:Pittsburgh
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:Systems Administrator
Common Name (eg, YOUR name) []:localhost.example.org
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:SOME PASSWORD
An optional company name []:Another Name

请注意在回答 “Common Name” 时使用的是一个域名。 这个提示要求输入服务器的名字, 以完成验证过程; 如果在这里填入其他内容, 则证书就没有什么意义了。 其他选项主要是关于证书有效期和使用的算法。 openssl(1) 联机手册中包括了更详细的信息。

上述命令执行完之后应该会生成一个 cert.pem 到当前目录中。 这个证书可以发给一个 CA 进行签名。

如果不需要由 CA 签名, 也可以使用自签名的证书。 首先需要生成 CA 密钥:

# openssl gendsa -des3 -out \
myca.key 1024

然后用这个密钥来创建证书:

# openssl req -new -x509 -days 365 -key \
myca.key -out new.crt

上述步骤将在当前目录中生成两个新文件: 一个是权威发证机构的签名文件, myca.key 另一个则是证书本身, new.crt。 这些文件应放到一个目录中, 通常推荐放在 /etc 下, 且只能被 root 读取。 0600 这样的权限应该就足够了, 您可以用 chmod 来完成修改。

14.10.2. 使用证书的一个例子

那么有了这些文件可以做些什么呢? 一个比较典型的用法是用来加密 Sendmail MTA 的通讯连接。 这可以解决用户通过本地 MTA 发送邮件时使用明文进行身份验证的问题。

Note: 这个用法可能并不完美, 因为某些 MUA 会由于没有在本地安装证书而向用户发出警告。 请参考那些软件的说明了解关于安装证书的信息。

下面的设置应添加到本地的 .mc 文件

dnl SSL Options
define(`confCACERT_PATH',`/etc/certs')dnl
define(`confCACERT',`/etc/certs/new.crt')dnl
define(`confSERVER_CERT',`/etc/certs/new.crt')dnl
define(`confSERVER_KEY',`/etc/certs/myca.key')dnl
define(`confTLS_SRV_OPTIONS', `V')dnl

这里 /etc/certs/ 是准备用来在本地保存证书和密钥的位置。 最后需要重新生成本地的 .cf 文件。 这个工作可以很容易地通过在 /etc/mail 目录中执行 make install 来完成。 然后可以执行 make restart 来重新启动 Sendmail 服务程序。

如果一切正常, 则 /var/log/maillog 中不会出现错误提示, Sendmail 也应该出现在进程列表中。

做一个简单的测试, 使用 telnet(1) 来连接邮件服务器:

# telnet example.com 25
Trying 192.0.34.166...
Connected to example.com.
Escape character is '^]'.
220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT)
ehlo example.com
250-example.com Hello example.com [192.0.34.166], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP
quit
221 2.0.0 example.com closing connection
Connection closed by foreign host.

如果输出中出现了 “STARTTLS” 则说明一切正常。