13.6. OpenSSL

Written by Tom Rhodes.

OpenSSL 是 SSL 和 TLS 协议的开源实现。它在传输层上提供加密传输功能。

FreeBSD 中的 OpenSSL 支持 Secure Sockets Layer 3.0 (SSLv3) 和 Transport Layer Security 1.0/1.1/1.2 (TLSv1/TLSv1.1/TLSv1.2) 等网络安全协议,可以像普通的加密库一样掉用,在 FreeBSD 12.0-RELEASE 之后,FreeBSD 中默认的 OpenSSL 也支持 Transport Layer Security 1.3 (TLSv1.3)。

OpenSSL 常用于需要安全加密传输的场合,例如邮箱验证,信用卡支付。一些软件,如www/apache24databases/postgresql11-server,会提供一个与 OpenSSL 链接的编译选项。如果选上了,该软件将会使用基础系统里提供的 OpenSSL。若要使用 Port 中的 OpenSSL,请将下列内容添加到/etc/make.conf

DEFAULT_VERSIONS+= ssl=openssl

OpenSSL 能为应用程序生成证书。证书用于身份验证。如果该证书不是由Certificate Authority(证书颁发机构,缩写 CA,例如 http://www.verisign.com)颁发的,那么应用程序使用时可能会发出警告。获取 CA 签名的证书需要些钱,并且使用已签名证书不是必需的,因为证书可以自签名。但是,使用外部授权可以防止警告,并可以让用户放心。

本章介绍如何在 FreeBSD 上生成和使用证书。第 29.5.2 节 “设定LDAP服务器”中有个例子介绍如何创建用于签署自己的证书的 CA。

欲知更多关于 OpenSSL 的信息,请参阅OpenSSL Cookbook

13.6.1. 生成证书

使用以下命令并按照提示输入信息就可以生成一张由外部 CA 签名的证书。输入的信息将会写入证书。在Common Name提示付处输入将使用这个证书的系统的全名。如果此名字与 server 不匹配,应用程序在校验证书时将向用户发出警告,并提示此证书失效。

# openssl req -new -nodes -out req.pem -keyout cert.key -sha256 -newkey rsa:2048
Generating a 2048 bit RSA private key
..................+++
.............................................................+++
writing new private key to 'cert.key'
-----
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 []:trhodes@FreeBSD.org

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

其他选项,例如过期时间和加密算法,在创建证书时可调整。选项的完整列表可在openssl(1)查看。

此命令将在当前目录下创建两个文件:证书请求文件,req.pem,需要发送到 CA,此文件将用于验证输入的凭据,签名请求,并返回已签名的证书。私钥,cert.key,应存储在安全位置。如果这落在其他人手中,则可以使用它来模拟用户或服务器。

如果不需要CA签名,则可以创建自签名证书。首先,生成RSA密钥:

# openssl genrsa -rand -genkey -out cert.key 2048
0 semi-random bytes loaded
Generating RSA private key, 2048 bit long modulus
.............................................+++
.................................................................................................................+++
e is 65537 (0x10001)

使用此密钥来创建自签名证书:

# openssl req -new -x509 -days 365 -key cert.key -out cert.crt -sha256
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 (e.g. server FQDN or YOUR name) []:localhost.example.org
Email Address []:trhodes@FreeBSD.org

这将在当前目录下创建两个文件:私钥cert.key,公钥cert.crt。可以将这两个文件放在/etc/ssl/,并将其权限设为 0700(只能由root用户读取)。

13.6.2. 使用证书

证书的可用于加密客户端与邮件服务器(例如Sendmail)之间的连接,避免使用明文身份验证。

注意:

如果用户尚未安装证书的本地副本,则某些邮件客户端将显示错误。有关证书安装的详细信息,请参阅软件随附的文档。

在 FreeBSD 10.0-RELEASE 之后,可以自动为 Sendmail 创建自签名证书,要开启此功能,请将以下行添加到 /etc/rc.conf

sendmail_enable="YES"
sendmail_cert_create="YES"
sendmail_cert_cn="localhost.example.org"

这将自动创建一个自签名证书,/etc/mail/certs/host.cert,一个签名密钥,/etc/mail/certs/host.key,和一个 CA 证书/etc/mail/certs/cacert.pem。证书将使用 sendmail_cert_cn 中指定的 通用名称 。保存编辑后,重新启动 Sendmail

# service sendmail restart

如果一切正常,/var/log/maillog 中不会产生错误消息。使用 telnet 连接邮件服务器进行简单测试:

# telnet example.com 25
Trying 192.0.34.166...
Connected to example.com.
Escape character is '^]'.
220 example.com ESMTP Sendmail 8.14.7/8.14.7; Fri, 18 Apr 2014 11:50:32 -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行出现在输出中,则一切工作正常。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.