OpenSSLEssentials:使用SSL证书、私钥和CSR

来自菜鸟教程
跳转至:导航、​搜索

介绍

OpenSSL 是一个多功能命令行工具,可用于与公钥基础设施 (PKI) 和 HTTPS(HTTP over TLS)相关的各种任务。 此备忘单样式指南提供了对在常见的日常场景中有用的 OpenSSL 命令的快速参考。 这包括用于生成私钥、证书签名请求和证书格式转换的 OpenSSL 示例。 它并未涵盖 OpenSSL 的所有用途。

如何使用本指南:

  • 如果您不熟悉证书签名请求 (CSR),请阅读第一部分
  • 除第一部分外,本指南采用备忘单格式:自包含命令行片段列表
  • 跳转到与您尝试完成的任务相关的任何部分(提示:使用 Contents 菜单或浏览器的 Find 功能)
  • 大多数命令是单行的,为了清楚起见,已扩展为多行(使用 \ 符号)

关于证书签名请求 (CSR)

如果您想从商业证书颁发机构 (CA) 获取 SSL 证书,则必须生成证书签名请求 (CSR)。 CSR 主要由密钥对的公钥和一些附加信息组成。 这两个组件在签名时都插入到证书中。

每当您生成 CSR 时,系统都会提示您提供有关证书的信息。 此信息称为专有名称 (DN)。 DN 中的一个重要字段是 Common Name (CN),它应该是您打算使用证书的主机的完全限定域名 (FQDN)。 在创建 CSR 时,也可以通过命令行或文件传递信息来跳过交互式提示。

DN 中的其他项目提供有关您的企业或组织的附加信息。 如果您从证书颁发机构购买 SSL 证书,通常需要这些附加字段(例如“组织”)准确反映您组织的详细信息。

以下是 CSR 信息提示的示例:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

如果您想以非交互方式回答 CSR 信息提示,您可以通过将 -subj 选项添加到任何请求 CSR 信息的 OpenSSL 命令来实现。 这是该选项的示例,使用上面代码块中显示的相同信息:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

既然您了解了 CSR,请随意跳到本指南中涵盖您的 OpenSSL 需求的任何部分。

生成 CSR

本节介绍与生成 CSR(和私钥,如果它们不存在)相关的 OpenSSL 命令。 CSR 可用于从证书颁发机构请求 SSL 证书。

请记住,您可以使用上一节中提到的 -subj 选项以非交互方式添加 CSR 信息。

生成私钥和 CSR

如果您想使用 HTTPS(HTTP over TLS)来保护您的 Apache HTTP 或 Nginx Web 服务器,并且您想使用证书颁发机构 (CA) 来颁发 SSL 证书,请使用此方法。 生成的 CSR 可以发送到 CA 以请求颁发 CA 签名的 SSL 证书。 如果您的 CA 支持 SHA-2,请添加 -sha256 选项以使用 SHA-2 签署 CSR。

此命令从头开始创建 2048 位私钥 (domain.key) 和 CSR (domain.csr):

openssl req \
       -newkey rsa:2048 -nodes -keyout domain.key \
       -out domain.csr

回答 CSR 信息提示以完成该过程。

-newkey rsa:2048 选项指定密钥应该是 2048 位,使用 RSA 算法生成。 -nodes 选项指定私钥应该 而不是 使用密码短语加密。 -new 选项(此处未包含但隐含)表示正在生成 CSR。

从现有私钥生成 CSR

如果您已经拥有一个想要用于从 CA 请求证书的私钥,请使用此方法。

此命令基于现有私钥 (domain.key) 创建一个新的 CSR (domain.csr):

openssl req \
       -key domain.key \
       -new -out domain.csr

回答 CSR 信息提示以完成该过程。

-key 选项指定将用于生成新 CSR 的现有私钥 (domain.key)。 -new 选项表示正在生成 CSR。

从现有证书和私钥生成 CSR

如果您想续订现有证书但您或您的 CA 由于某种原因没有原始 CSR,请使用此方法。 它基本上省去了重新输入 CSR 信息的麻烦,因为它从现有证书中提取了该信息。

此命令基于现有证书 (domain.crt) 和私钥 (domain.key) 创建新的 CSR (domain.csr):

openssl x509 \
       -in domain.crt \
       -signkey domain.key \
       -x509toreq -out domain.csr

-x509toreq 选项指定您使用 X509 证书制作 CSR。

生成 SSL 证书

如果您想使用 SSL 证书来保护服务,但不需要 CA 签名的证书,一个有效(且免费)的解决方案是签署您自己的证书。

您可以自己颁发的常见证书类型是 自签名证书 。 自签名证书是使用自己的私钥签名的证书。 自签名证书与 CA 签名证书一样可用于加密数据,但您的用户将看到一条警告,指出该证书不受其计算机或浏览器的信任。 因此,仅当您不需要向其用户证明您的服务的身份时,才应使用自签名证书(例如 非生产或非公共服务器)。

本节介绍与生成自签名证书相关的 OpenSSL 命令。

生成自签名证书

如果您想使用 HTTPS(基于 TLS 的 HTTP)来保护您的 Apache HTTP 或 Nginx Web 服务器,并且不需要您的证书由 CA 签名,请使用此方法。

此命令从头开始创建 2048 位私钥 (domain.key) 和自签名证书 (domain.crt):

openssl req \
       -newkey rsa:2048 -nodes -keyout domain.key \
       -x509 -days 365 -out domain.crt

回答 CSR 信息提示以完成该过程。

-x509 选项告诉 req 创建一个自签名证书。 -days 365 选项指定证书有效期为 365 天。 生成临时 CSR 以收集与证书关联的信息。

从现有私钥生成自签名证书

如果您已经有一个想要用它生成自签名证书的私钥,请使用此方法。

此命令从现有私钥 (domain.key) 创建自签名证书 (domain.crt):

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

回答 CSR 信息提示以完成该过程。

-x509 选项告诉 req 创建一个自签名证书。 -days 365 选项指定证书有效期为 365 天。 -new 选项启用 CSR 信息提示。

从现有私钥和 CSR 生成自签名证书

如果您已经拥有私钥和 CSR,并且想要使用它们生成自签名证书,请使用此方法。

此命令从现有私钥 (domain.key) 和 (domain.csr) 创建自签名证书 (domain.crt):

openssl x509 \
       -signkey domain.key \
       -in domain.csr \
       -req -days 365 -out domain.crt

-days 365 选项指定证书有效期为 365 天。

查看证书

证书和 CSR 文件以 PEM 格式编码,人类不易阅读。

本节介绍将输出 PEM 编码文件的实际条目的 OpenSSL 命令。

查看企业社会责任条目

此命令允许您以纯文本形式查看和验证 CSR (domain.csr) 的内容:

openssl req -text -noout -verify -in domain.csr

查看证书条目

此命令允许您以纯文本形式查看证书 (domain.crt) 的内容:

openssl x509 -text -noout -in domain.crt

验证证书是否由 CA 签署

使用此命令验证证书 (domain.crt) 是否由特定 CA 证书 (ca.crt) 签名:

openssl verify -verbose -CAFile ca.crt domain.crt

私钥

本节介绍特定于创建和验证私钥的 OpenSSL 命令。

创建私钥

使用此命令创建受密码保护的 2048 位私钥 (domain.key):

openssl genrsa -des3 -out domain.key 2048

在提示完成该过程时输入密码。

验证私钥

使用此命令检查私钥 (domain.key) 是否为有效密钥:

openssl rsa -check -in domain.key

如果您的私钥已加密,系统将提示您输入其密码。 成功后,未加密的密钥将在终端上输出。

验证私钥与证书和 CSR 匹配

使用这些命令来验证私钥 (domain.key) 是否与证书 (domain.crt) 和 CSR (domain.csr) 匹配:

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):

openssl rsa -des3 \
       -in unencrypted.key \
       -out encrypted.key

输入您想要的密码短语,以加密私钥。

解密私钥

这需要一个加密的私钥(encrypted.key)并输出它的解密版本(decrypted.key):

openssl rsa \
       -in encrypted.key \
       -out decrypted.key

出现提示时输入加密密钥的密码。

转换证书格式

我们一直在使用的所有证书都是 ASCII PEM 编码的 X.509 证书。 还有多种其他证书编码和容器类型; 某些应用程序比其他应用程序更喜欢某些格式。 此外,许多这些格式可以在单个文件中包含多个项目,例如私钥、证书和 CA 证书。

OpenSSL 可用于将证书与多种这些格式相互转换。 本节将介绍一些可能的转换。

将 PEM 转换为 DER

如果要将 PEM 编码的证书 (domain.crt) 转换为 DER 编码的证书 (domain.der),请使用此命令,这是一种二进制格式:

openssl x509 \
       -in domain.crt \
       -outform der -out domain.der

DER 格式通常与 Java 一起使用。

将 DER 转换为 PEM

如果要将 DER 编码证书 (domain.der) 转换为 PEM 编码证书 (domain.crt),请使用此命令:

openssl x509 \
       -inform der -in domain.der \
       -out domain.crt

将 PEM 转换为 PKCS7

如果要将 PEM 证书(domain.crtca-chain.crt)添加到 PKCS7 文件(domain.p7b),请使用此命令:

openssl crl2pkcs7 -nocrl \
       -certfile domain.crt \
       -certfile ca-chain.crt \
       -out domain.p7b

请注意,您可以使用一个或多个 -certfile 选项来指定要添加到 PKCS7 文件中的证书。

PKCS7 文件,也称为 P7B,通常用于 Java 密钥库和 Microsoft IIS (Windows)。 它们是 ASCII 文件,可以包含证书和 CA 证书。

将 PKCS7 转换为 PEM

如果要将 PKCS7 文件 (domain.p7b) 转换为 PEM 文件,请使用此命令:

openssl pkcs7 \
       -in domain.p7b \
       -print_certs -out domain.crt

请注意,如果您的 PKCS7 文件中有多个项目(例如 证书和 CA 中间证书),创建的 PEM 文件将包含其中的所有项目。

将 PEM 转换为 PKCS12

如果要获取私钥 (domain.key) 和证书 (domain.crt),请使用此命令,并将它们组合成 PKCS12 文件 (domain.pfx):

openssl pkcs12 \
       -inkey domain.key \
       -in domain.crt \
       -export -out domain.pfx

系统将提示您输入导出密码,您可以将其留空。 请注意,在这种情况下,您可以通过将证书连接到单个 PEM 文件 (domain.crt) 中来将证书链添加到 PKCS12 文件。

PKCS12 文件,也称为 PFX 文件,通常用于在 Microsoft IIS (Windows) 中导入和导出证书链。

将 PKCS12 转换为 PEM

如果要转换 PKCS12 文件 (domain.pfx) 并将其转换为 PEM 格式 (domain.combined.crt),请使用此命令:

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

请注意,如果您的 PKCS12 文件中有多个项目(例如 证书和私钥),创建的 PEM 文件将包含其中的所有项目。

OpenSSL 版本

openssl version 命令可用于检查您正在运行的版本。 您正在运行的 OpenSSL 版本以及编译时使用的选项会影响您可用的功能(有时还会影响命令行选项)。

以下命令显示您正在运行的 OpenSSL 版本,以及编译它时使用的所有选项:

openssl version -a

本指南是使用具有以下详细信息的 OpenSSL 二进制文件编写的(上一个命令的输出):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -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 -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

结论

这应该涵盖大多数人如何使用 OpenSSL 来处理 SSL 证书。 它还有许多其他用途,此处未涵盖,因此请随时在评论中询问或建议其他用途。

如果您对任何命令有疑问,请务必发表评论(并包括您的 OpenSSL 版本输出)。