Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

4.7. 使用 OpenSSL

OpenSSL 是一个为应用程序提供加密协议的库。openssl 命令行工具启用使用 shell 中的加密功能。它包含一个交互模式。
openssl 命令行工具有许多伪命令,用于提供有关系统上安装 openssl 版本的命令的信息。pseudo-commands list-standard-commandslist-message-digest-commandslist-cipher-commands 会分别输出所有标准命令、消息摘要命令或密码命令的列表,它们分别位于 present openssl 工具中。
pseudo-commands list-cipher-algorithmslist-message-digest-algorithms 列出所有密码和消息摘要名称。pseudo-command list-public-key-algorithms 列出所有支持的公钥算法。例如,要列出支持的公钥算法,请运行以下命令:
~]$ openssl list-public-key-algorithms
pseudo-command no-command-name 测试指定名称的 command-name 是否可用。旨在在 shell 脚本中使用。如需更多信息,请参阅 man openssl(1)

4.7.1. 创建和管理加密密钥

使用 OpenSSL 时,公钥从对应的私钥衍生而来。因此,在决定算法后,第一步是生成私钥。在这些示例中,私钥称为 privkey.pem。例如,要使用默认参数创建 RSA 私钥,请运行以下命令:
~]$ openssl genpkey -algorithm RSA -out privkey.pem
RSA 算法支持以下选项:
  • rsa_keygen_bits:numbits - 生成的密钥中的位数。如果没有指定 1024,则使用。
  • rsa_keygen_pubexp:value - RSA public exponent 值。如果前面带有 0x,则可以是大的十进制值,也可以是十六进制值。默认值为 65537
例如,要使用 3 作为公钥创建 2048 位 RSA 私钥,请运行以下命令:
~]$ openssl genpkey -algorithm RSA -out privkey.pem -pkeyopt rsa_keygen_bits:2048 \ -pkeyopt rsa_keygen_pubexp:3
要使用 128 位 AES 和密码短语 hello 来加密私钥,请运行以下命令:
~]$ openssl genpkey -algorithm RSA -out privkey.pem -aes-128-cbc -pass pass:hello
有关生成私钥的更多信息,请参阅 man genpkey(1)

4.7.2. 生成证书

要使用 OpenSSL 生成证书,需要一个有可用的私钥。在这些示例中,私钥称为 privkey.pem。如果您还没有生成私钥,请查看 第 4.7.1 节 “创建和管理加密密钥”
要使 证书由证书颁发机构 (CA)签名,需要生成一个证书,然后将其发送到 CA 进行签名。这称为证书签名请求。请参阅 第 4.7.2.1 节 “创建证书签名请求” 了解更多信息。另一种方法是创建一个自签名证书。请参阅 第 4.7.2.2 节 “创建自签名证书” 了解更多信息。

4.7.2.1. 创建证书签名请求

要创建提交给 CA 的证书,以以下格式发出命令:
~]$ openssl req -new -key privkey.pem -out cert.csr
这将以默认 的隐私增强型电子邮件 (PEM)格式创建经过编码的名为 cert.csr 的 X.509 证书。名称 PEM 派生自 RFC 1424 中描述的 互联网 Electronic 邮件的隐私增强。要以替代 DER 格式生成证书文件,请使用 -outform DER 命令选项。
在发出上述命令后,系统将提示您提供关于您和组织的信息,以便为证书创建 可分辨名称 (DN)。您需要以下信息:
  • 您国家有两个字母国家/地区代码
  • 您州的全名或省
  • City 或 Town
  • 您的机构名称
  • 机构中单元的名称
  • 您的系统名称或主机名
  • 您的电子邮件地址
req(1) man page 描述了 PKCS# 10 证书请求和生成工具。创建流程中使用的默认设置包含在 /etc/pki/tls/openssl.cnf 文件中。如需更多信息,请参阅 man openssl.cnf (5)

4.7.2.2. 创建自签名证书

要生成自签名证书,请对 366 天有效,以以下格式发出命令:
~]$ openssl req -new -x509 -key privkey.pem -out selfcert.pem -days 366

4.7.2.3. 使用 Makefile 创建证书

/etc/pki/tls/certs/ 目录包含一个 Makefile,可用于使用 make 命令创建证书。要查看使用说明,请运行以下命令:
~]$ make -f /etc/pki/tls/certs/Makefile
或者,切换到目录并发出 make 命令,如下所示:
~]$ cd /etc/pki/tls/certs/
~]$ make
详情请查看 make(1) man page。

4.7.3. 验证证书

CA 签名的证书称为可信证书。因此,自签名证书是不受信任的证书。verify 实用程序使用相同的 SSL 和 S/MIME 功能来验证 OpenSSL 在正常操作中使用的证书。如果发现错误,则会报告错误,然后尝试继续测试以报告任何其他错误。
要以 PEM 格式验证多个独立 X.509 证书,以以下格式发出命令:
~]$ openssl verify cert1.pem cert2.pem
要验证证书链,leaf 证书必须位于 cert.pem 中,您不信任的中间证书必须在 untrusted.pem 中直接连接。可信 root CA 证书必须在 /etc/pki/tls/certs/ca-bundle.crtcacert.pem 文件中列出的默认 CA 中。然后,要验证链,以以下格式发出命令:
~]$ openssl verify -untrusted untrusted.pem -CAfile cacert.pem cert.pem
如需更多信息,请参阅 man verify(1)
重要
由于这个算法的强度不足,Red Hat Enterprise Linux 7 中禁用了使用 MD5 哈希算法的签名验证。始终使用强大的算法,如 SHA256。

4.7.4. 加密和解密文件

要使用 OpenSSL 加密(和解密)文件,可以使用 pkeyutlenc 内置命令。使用 pkeyutl 时,RSA 密钥用于执行加密和解密,而使用 enc,使用对称算法。

使用 RSA 密钥

要加密名为 纯文本 的文件,请按如下所示发出命令:
~]$ openssl pkeyutl -in plaintext -out cyphertext -inkey privkey.pem
密钥和证书的默认格式为 PEM。如果需要,使用 -keyform DER 选项指定 DER 密钥格式。
要指定加密引擎,请使用 -engine 选项,如下所示:
~]$ openssl pkeyutl -in plaintext -out cyphertext -inkey privkey.pem -engine id
其中 id 是加密引擎的 ID。要检查引擎的可用性,请运行以下命令:
~]$ openssl engine -t
要签名名为 plaintext 的数据文件,请运行以下命令:
~]$ openssl pkeyutl -sign -in plaintext -out sigtext -inkey privkey.pem
要验证签名数据文件并提取数据,请运行以下命令:
~]$ openssl pkeyutl -verifyrecover -in sig -inkey key.pem
要验证签名,例如使用 DSA 密钥,请按如下所示发出命令:
~]$ openssl pkeyutl -verify -in file -sigfile sig -inkey key.pem
pkeyutl(1) 手册页描述了公钥算法工具。

使用 Symmetric Algorithms

要列出可用的对称加密算法,请使用不支持的选项执行 enc 命令,如 -l
~]$ openssl enc -l
要指定算法,请使用其名称作为选项。例如,要使用 aes-128-cbc 算法,请使用以下语法:
openssl enc -aes-128-cbc
要使用 aes-128-cbc 算法加密名为 plaintext 的文件,请输入以下命令:
~]$ openssl enc -aes-128-cbc -in plaintext -out plaintext.aes-128-cbc
要解密上例中获取的文件,请使用 -d 选项,如下例所示:
~]$ openssl enc -aes-128-cbc -d -in plaintext.aes-128-cbc -out plaintext
重要
enc 命令无法正确支持 AEAD 密码,而 ecb 模式则被视为安全。为获得最佳结果,请不要使用 cbc 以外的其他模式、cfbbctr

4.7.5. 生成消息 Digests

dgst 命令以十六进制形式生成所提供的文件或文件的消息摘要。命令也可用于数字签名和验证。message digest 命令采用以下格式:
openssl dgst algorithm -out filename -sign private-key
其中 algorithmmd5|md4|md2|sha1|sha|mdc2|ripemd160|dss1 之一。编写本文时,首选使用 SHA1 算法。如果您需要使用 DSA 签名或进行验证,则必须将 dss1 选项与包含 -rand 选项指定的随机数据的文件一起使用。
要使用 sha1 算法以默认 Hex 格式生成消息摘要,请运行以下命令:
~]$ openssl dgst sha1 -out digest-file
要使用私钥 privekey.pem 对摘要进行数字签名,请运行以下命令:
~]$ openssl dgst sha1 -out digest-file -sign privkey.pem
如需更多信息,请参阅 man dgst(1)

4.7.6. 生成密码散列

passwd 命令计算密码的哈希。要在命令行中计算密码的哈希值,请运行以下命令:
~]$ openssl passwd password
默认使用 -crypt 算法。
要从标准输入(使用基于 MD5 的 BSD 算法 1) 计算密码的哈希值,请运行以下命令:
~]$ openssl passwd -1 password
-apr1 选项指定 BSD 算法的 Apache 变体。
注意
仅在禁用 FIPS 模式的 openssl passwd -1 password 命令。否则,命令不起作用。
要计算存储在文件中的密码的哈希值,并使用 salt xx,请运行以下命令:
~]$ openssl passwd -salt xx -in password-file
密码发送到标准输出,没有 -out 选项来指定输出文件。table 将生成包含其相应的明文密码的密码哈希表。
如需更多信息和示例,请参阅 man sslpasswd(1)

4.7.7. 生成随机数据

要使用 seed 文件生成包含随机数据的文件,请运行以下命令:
~]$ openssl rand -out rand-file -rand seed-file
可以使用冒号 : 来指定用于查找随机数据进程的多个文件,作为列表分隔符。
如需更多信息,请参阅 man rand(1)

4.7.8. 基准测试您的系统

要测试给定算法的系统的计算速度,以以下格式发出命令:
~]$ openssl speed algorithm
其中 algorithm 是您要使用的支持的算法之一。要列出可用的算法,请键入 openssl speed,然后按 选项卡。

4.7.9. 配置 OpenSSL

OpenSSL 有一个配置文件 /etc/pki/tls/openssl.cnf,称为 master 配置文件,该文件由 OpenSSL 库读取。也可以为每个应用程序拥有单独的配置文件。配置文件包含多个部分,其部分名称如下: [ section_name ]。注意文件的第一个部分,直到第一个 [ section_name ] 被指代为 default 部分。当 OpenSSL 在配置文件中搜索名称时,首先搜索指定部分的名称。所有 OpenSSL 命令都使用 master OpenSSL 配置文件,除非命令中使用了一个选项来指定替代的配置文件。配置文件在 config (5) 手册页中详细介绍。
两个 RFC 解释了证书文件的内容。它们是: