OpenSSL 是一个开源加密库,包含各种用于 TLS 协议 和 公钥基础设施 的命令。OpenSSL 于 1998 年发布,适用于 Windows、Linux、macOS 和 BSD 系统。OpenSSL 命令将帮助您执行各种任务,包括证书签名请求 (CSR)、私钥生成和 SSL 证书。
OpenSSL 非常重要,因为它能确保正确的 SSL 实施。以正确的方式获取 SSL 对您网站的安全至关重要。此外,作为顶级搜索引擎的 Google 会优先考虑已实施 SSL 证书的网站。如果您没有正确的 SSL 证书,Chrome 和 Firefox 等某些浏览器可能会将您的网站标记为“不安全”。因此,通过加密的 HTTPS 协议传输您的网站流量至关重要。
首先
本教程是一个速查表风格的指南,包含了一些但可能并非全部您在日常场景中可能会用到的 OpenSSL 命令。
第一部分解释了您需要了解的关于 证书签名请求 (CSR) 的所有内容。但是,如果您已经熟悉它,可以跳到与您要实现的目标相关的任何其他部分。每个部分都包含一个命令行片段,用于完成副标题所述的操作。
让我们开始吧!
第 1 部分:了解证书签名请求 (CSR)
从证书颁发机构 (CA) 获取 SSL 证书时,证书签名请求是先决条件。CSR 包含密钥对的公钥和一些附加信息。您需要在签名过程中将它们插入到证书中。
在生成 CSR 期间,系统会提示您提供标识信息,这被称为区分名 (DN)。DN 包含证书所需的字段,例如通用名称 (CN),它是将使用该证书的主机的确切完全限定域名 (FQDN)。DN 的其他字段用于填写附加信息,例如国家、州/省、地区名称以及组织或业务名称(如果您正在生成针对您业务的特定证书)。您可以选择通过从文件或命令行提供信息来跳过这些提示。
请看下面屏幕截图中的 CSR 信息提示示例:
|
1 2 3 4 5 6 7 |
国家 名称 (2 字母 代码) [AU]:CH 州/省 或 省份 名称 (完整 名称) [Some-State]:Zürich 地区 名称 (例如, 城市) []:Old Town 组织 名称 (例如, 公司) [Internet Widgits Pty Ltd]:Example Cloudsigma 公司 组织 单位 名称 (例如, 部门) []:Cloud Technology 通用 名称 (e.g. 服务器 FQDN 或 您的 名称) []:cloudsigma.com 电子邮件 地址 []:info@cloudsigma.com |
您可以通过添加如下所示的 -subj 标志并在单行命令中提供信息来避免提示,并提供各字段的信息:
|
1 |
-subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
上述命令采用与 CSR 信息提示代码块示例中显示的相同信息。
第 2 部分:生成证书签名请求
在本部分中,我们将介绍可用于生成 CSR 和私钥的 OpenSSL 命令。CSR 是向证书颁发机构 (CA) 申请 SSL 证书所必需的。
生成私钥和证书签名请求
如果您希望证书颁发机构颁发 SSL 证书以保护您的 Apache 或 Nginx 服务器通过 HTTPS(即带有 TLS 的 HTTP)提供流量服务。使用该命令生成的 CSR 可以发送给 CA 以申请 CA 签名的 SSL 证书。您可以参考我们的详细指南来了解如何设置您的 Apache 或 Nginx 服务器在 Ubuntu 上。
在终端中输入以下命令以从头生成一个 2048 位的私钥(domain.key)和 CSR(domain.csr):
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr |
根据提示输入您具体的 CSR 信息。或者,您可以在命令中添加 -subj 标志以跳过提示:
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
The -newkey rsa:2048 标志指定应使用 2048 位 RSA 算法生成密钥。而 -nodes 标志表示不对私钥进行密码加密。还有一个 -new 选项虽然未包含,但已隐含,表示生成新的 CSR。
从现有私钥生成证书签名请求
如果您已经拥有私钥,则可以使用此方法生成 CSR。然后,您将使用它向 CA 申请 SSL 证书。输入以下命令,使用现有的私钥(domain.csr)生成新的 CSR(domain.key):
|
1 |
openssl req -key domain.key -new -out domain.csr |
根据提示输入您具体的 CSR 信息。或者,您可以在命令中添加 -subj 标志 以跳过提示:
|
1 |
openssl req -key domain.key -new -out domain.csr -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
The flag -key 标志指定了用于生成新 CSR 的现有私钥(domain.key)。而 -new 标志表示正在生成新的 CSR。
从现有证书和私钥生成证书签名请求
如果您已经拥有一个现有的证书,并希望使用它来生成 CSR,则可以使用此方法。如果您或您的 CA 丢失了原始 CSR,并且您需要使用之前输入的 CSR 信息来生成它而无需重新输入,则此方法非常有用。该命令会从现有证书中提取信息。在终端中输入以下命令,以创建新的 CSR(domain.csr),使用现有的 证书(domain.crt)和现有的私钥(domain.key):
|
1 |
openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr |
-x509toreq 选项表示您正在使用 X509 证书 来生成 CSR。
第 3 部分:生成 SSL 证书
在某些情况下,您可能希望使用 SSL 证书,而无需繁琐地获取 CA 签名的证书。本节将介绍如何对您自己的证书进行签名。它是有效且免费的。这些证书被称为 自签名证书,并且它们非常常见。
自签名证书是使用其自身的私钥进行签名的。自签名证书和 CA 签名证书在加密数据和网站流量方面的效果一样好。然而,使用自签名证书时,用户通常会在浏览器中收到证书不可信的警告。因此,您可以将自签名证书用于不与用户交换敏感信息的网站,或用于非生产服务器。在下方,您可以找到用于生成自签名证书的 OpenSSL 命令。
- 生成自签名证书
您可以使用此方法生成 SSL 证书来保护您的 Apache 或 Nginx 服务器。这将确保流量通过 HTTPS(即基于 TLS 的 HTTP)传输,而无需前往 CA 进行证书签名:
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt |
根据提示输入您特定的 CSR 信息。或者,您也可以在命令中添加 -subj 标志 以避免出现提示:
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
其中 -x509 标志表示创建自签名证书。 -days 365 选项指定证书的有效天数。在本例中为 365 天。您也可以选择不同的天数。该命令会生成一个临时 CSR,用于保存应与证书关联的信息。
- 从现有私钥生成自签名证书
此方法将帮助您从已有的私钥生成自签名证书。输入以下命令以使用现有的私钥(domain.crt)生成自签名证书(domain.key):
|
1 |
openssl req -key domain.key -new -x509 -days 365 -out domain.crt |
根据提示输入您特定的 CSR 信息。或者,您也可以在命令中添加 -subj 标志 以避免出现提示:
|
1 |
openssl req -key domain.key -new -x509 -days 365 -out domain.crt -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
其中 -x509 标志表示创建自签名证书。 -days 365 选项指定证书的有效天数。在本例中为 365 天。您也可以选择不同的天数。 -new 选项会启动 CSR 信息提示。
第 4 部分:查看证书
证书和 CSR 文件经过编码并以 .pem 后缀存储。它代表隐私增强邮件(Privacy-Enhanced Mail)。这是一种用于存储和发送加密密钥、证书和其他关键数据的文件格式。PEM 文件不易于人类直接阅读。在本节中,您将找到可用于查看编码 PEM 文件中条目的命令。
- 查看 CSR 文件
在终端中输入以下命令以查看并验证 CSR(domain.csr)的内容:
|
1 |
openssl req -text -noout -verify -in domain.csr |
例如,上述命令可能会输出类似以下的内容:

- 查看证书条目
输入以下命令以查看证书(domain.crt):
|
1 |
openssl x509 -text -noout -in domain.crt |
上述命令可能会输出类似以下的内容:

- 验证证书是否由证书颁发机构签名
要验证证书(domain.crt)是否由特定的 CA 证书(ca.crt)签名,请输入以下命令:
|
1 |
openssl verify -verbose -CAfile ca.crt domain.crt |
第 5 部分:私钥
如果您正在寻找创建和验证私钥所需的 OpenSSL 命令,本节内容正适合您。
- 创建私钥
要创建一个受密码保护的 2048 位私钥(domain.key),请在终端中输入以下命令:
|
1 |
openssl genrsa -des3 -out domain.key 2048 |
该命令将提示您输入密码以完成此过程。请参见下方截图:

- 验证私钥
要验证私钥(domain.key)的有效性,请在终端中输入以下命令:
|
1 |
openssl rsa -check -in domain.key |
然后,您需要提供密码。如果私钥已加密且您输入了正确的密码,终端上将显示未加密的密钥。请参见下方截图:

- 验证私钥是否与证书和 CSR 匹配
如果您想检查私钥(domain.key)是否与证书(domain.crt)以及 CSR(domain.csr)匹配,请在终端中输入以下命令:
|
1 2 3 |
openssl rsa -noout -modulus -in domain.key | openssl md5 openssl x509 -noout -modulus -in domain.crt | openssl md5 openssl req -noout -modulus -in domain.csr | openssl md5 |
如果您发现上述命令的输出完全相同,那么私钥、证书和 CSR 很可能是相关联的。
- 加密私钥
如果您有一个未加密的私钥(unencrypted.key)并且想要获取该密钥的加密版本(encrypted.key),请在终端中输入以下命令:
|
1 |
openssl rsa -des3 -in unencrypted.key -out encrypted.key |
该命令将提示您输入密码以加密私钥。
- 解密私钥
如果您有一个已加密的私钥(encrypted.key)并且想要获取其解密版本(decrypted.key),请在终端中输入以下命令:
|
1 |
openssl rsa -in encrypted.key -out decrypted.key |
该命令将提示您输入加密密钥的密码。如果您输入了正确的密码,它将被解密。输出将保存到 decrypted.key.
第 6 部分:转换证书格式
您可能已经注意到,到目前为止我们一直在使用 X.509 证书,这些证书是用 ASCII PEM 编码的。虽然这没什么问题,但您还可以使用其他多种证书编码和容器类型。在某些应用中,您可能更倾向于使用某些特定格式。此外,一些不同的格式可能在单个文件中包含多个项目,例如私钥、CSR 和 CA 签名的证书。您还可以使用 OpenSSL 在各种证书格式之间进行转换。继续阅读以了解一些用于证书格式转换的 OpenSSL 命令。
- 将 PEM 转换为 DER
DER(可辨别编码规则)是一种用于 X.509 证书和私钥的二进制编码。要将 PEM 编码的证书(domain.crt)转换为 DER 编码的证书(domain.der),请输入以下命令:
|
1 |
openssl x509 -in domain.crt -outform der -out domain.der |
您会发现 DER 编码格式的大多数使用场景都在 Java programming language 中。 请遵循此 tutorial for a quick set up of Java on your Ubuntu server.
- 将 DER 转换为 PEM
要将 DER 编码的证书(domain.der)转换为 PEM 证书(domain.crt),请输入以下命令:
|
1 |
openssl x509 -inform der -in domain.der -out domain.crt<code> |
- 将 PEM 转换为 PKCS7
您可能希望将 PEM 证书(例如 domain.crt 和 ca-chain.crt)添加到 PKCS7 文件(domain.p7b)中。以下是实现此操作的命令:
|
1 |
openssl crl2pkcs7 -nocrl -certfile domain.crt -certfile ca-chain.crt -out domain.p7b |
您可以使用 -certfile 选项多次指定要添加到 PKCS7 文件中的证书。PKCS7 文件主要与 Java 密钥库和 Microsoft IIS 相关。它们也被称为 P7B 文件,是包含证书和 CA 签名证书的 ASCII 文件。
- 将 PKCS7 转换为 PEM
要将 PKCS7 文件(domain.p7b)转换为 PEM 编码的文件(domain.crt),请在终端中输入以下命令:
|
1 |
openssl pkcs7 -in domain.p7b -print_certs -out domain.crt |
- 将 PEM 转换为 PKCS12
要将私钥(domain.key)和证书(domain.crt)合并为一个 PKCS12 文件 (domain.pfx),请输入以下命令:
|
1 |
openssl pkcs12 -inkey domain.key -in domain.crt -export -out domain.pfx |
该命令将提示您输入导出密码,您也可以选择留空。您可以通过将多个证书合并到一个 PEM 文件 (domain.crt) 中,从而将这些证书链接到 PKCS12 文件。PKCS12 也称为 PFX,主要用于 Microsoft IIS.
- 将 PKCS12 转换为 PEM
要将 PKCS12 文件 (domain.pfx) 转换为 PEM 编码格式 (domain.combined.crt),请输入以下命令:
|
1 |
openssl pkcs12 -in domain.pfx -nodes -out domain.combined.crt |
由上述命令创建的 PEM 文件包含 PKCS12 所保存的所有多个项目。
第 7 部分:检查 OpenSSL 版本
您运行的任何软件的版本都可能会影响您运行的应用程序的功能。因此,有必要确定其版本。OpenSSL 也是如此。某些命令行选项可能在某个版本中缺失,但在另一个版本中可用。要查看您正在运行的 OpenSSL 版本,请输入以下命令:
|
1 |
openssl version -a |
以下是我们在创建本教程时运行上述命令所获得的输出:
|
1 2 3 4 5 6 7 8 |
OpenSSL 1.1.1i 8 Dec 2020 built on: Sat Dec 19 15:39:47 2020 UTC platform: linux-x86_64 options: bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr) compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG OPENSSLDIR: "/usr/local/ssl" ENGINESDIR: "/usr/local/lib/engines-1.1" Seeding source: os-specific |
您可以在下方找到实际的屏幕截图:

结论
在本教程中,我们解释了什么是 OpenSSL,介绍了证书签名请求 (CSR) 以及您可以在服务器环境中使用的某些关键 OpenSSL 命令。
我们是否遗漏了某个关键命令,或者您在服务器设置中运行以下平台上的任何命令时遇到问题:CloudSigma?欢迎随时联系我们的24/7 客户支持团队进行实时聊天以讨论该问题。
祝您使用愉快!
评论
暂无评论。发表第一条评论吧。