OpenSSL 基础知识:使用 SSL 证书、私钥和 CSR

介绍

OpenSSL 是一个多功能的命令行工具,可用于各种与公共密钥基础设施(PKI)和HTTPS(HTTP over TLS)相关的任务。这个骗局表风格指南提供了一个快速参考的 OpenSSL 命令,这些命令在常见的日常情况下是有用的。这包括生成私钥、证书签名请求和证书格式转换的 OpenSSL 示例。

** 如何使用此指南:**

  • 如果您不熟悉证书签名请求(CSRs),请阅读第一个部分
  • 除了第一个部分,本指南以骗局表格格式:自包含的命令行片段 的列表* 跳到您正在尝试完成的任务相关的任何部分(提示:使用 Contents 菜单或浏览器的 Find 函数)
  • 大多数命令是已扩展到多个行(使用 `` 符号)的单行

关于证书签名请求(CSRs)

如果您想从商业证书授权机构(CA)获得SSL证书,则必须生成证书签名请求(CSR)。

当您生成 CSR 时,您将被要求提供有关证书的信息. 此信息被称为 Distinguished Name (DN)。 DN 中的一个重要字段是 Common Name (CN),这应该是您打算使用证书的主机的完全合格域名(FQDN)。

DN 中的其他项目提供有关您的业务或组织的额外信息. 如果您正在从证书授权机构购买 SSL 证书,通常需要这些额外的字段,例如组织,准确地反映您的组织的细节。

以下是 CSR 信息提示程序将如何看待的例子:

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

如果您想非互动地回复 CSR 信息提示,您可以通过将 -subj 选项添加到任何要求 CSR 信息的 OpenSSL 命令中来做到这一点。

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

现在你已经了解 CSR 了,你可以自由地跳到本指南的任何部分,涵盖你的 OpenSSL 需求。

生成CSR

本节涵盖了与生成 CSR 相关的 OpenSSL 命令(以及私钥,如果尚不存在的话)。

请记住,您可以通过上一节提到的-subj选项非互动地添加 CSR 信息。

生成私钥和CSR

如果您想要使用 HTTPS (HTTP over TLS) 来保护您的 Apache HTTP 或 Nginx 网页服务器,并且您想要使用证书授权(CA)来发行 SSL 证书,则可以将生成的 CSR 发送给 CA 以要求发行 CA 签名的 SSL 证书。

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

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

响应 CSR 信息提示以完成过程。

-newkey rsa:2048 选项规定该密钥应该是 2048 位,使用 RSA 算法生成。 -nodes 选项规定私钥应该是 not 加密的通过短语。

从现有私钥中生成 CSR

使用此方法,如果您已经有一个私钥,您想使用它来从 CA 申请证书。

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

1openssl req \
2       -key domain.key \
3       -new -out domain.csr

响应 CSR 信息提示以完成过程。

钥匙选项指定一个现有的私钥(domain.key)将用于生成新的CSR。

从现有证书和私钥中生成 CSR

如果您想更新现有证书,但您或您的 CA 没有原始 CSR,则使用此方法,因为它从现有证书中提取该信息,基本上可以节省您重新输入 CSR 信息的麻烦。

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

1openssl x509 \
2       -in domain.crt \
3       -signkey domain.key \
4       -x509toreq -out domain.csr

-x509toreq选项指定您正在使用 X509 证书来创建 CSR。

创建SSL证书

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

一个常见的证书类型是自签证书。自签证书是用自己的私钥签名的证书。自签证书可以用来加密数据,就像CA签名的证书一样,但你的用户会看到一个警告,说明他们的计算机或浏览器不信任该证书。

本节涵盖了与生成自签证书相关的 OpenSSL 命令。

创建自我签名的证书

如果您想要使用 HTTPS (HTTP over TLS) 来保护您的 Apache HTTP 或 Nginx 网页服务器,您不需要您的证书由 CA 签名。

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

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

响应 CSR 信息提示以完成过程。

-x509选项告诉req创建自签证书. -days 365选项指定证书有效期为365天。

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

使用此方法,如果您已经有一个私钥,您希望使用它生成自签证书。

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

1openssl req \
2       -key domain.key \
3       -new \
4       -x509 -days 365 -out domain.crt

响应 CSR 信息提示以完成过程。

-x509选项告诉req创建自签证书. -days 365选项指定证书有效期为365天。

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

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

此命令会从现有私钥(‘domain.key’)和(‘domain.csr’)中创建一个自签证书(‘domain.crt’):

1openssl x509 \
2       -signkey domain.key \
3       -in domain.csr \
4       -req -days 365 -out domain.crt

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

查看证书

证书和CSR文件以PEM格式进行编码,不易于人读。

本节涵盖了OpenSSL命令,这些命令将输出PEM加密文件的实际条目。

查看 CSR 条目

此命令允许您在简单文本中查看和验证 CSR(domain.csr)的内容:

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

查看证书入口

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

1openssl x509 -text -noout -in domain.crt

验证 证书由 CA 签署

使用此命令来验证一个证书(‘domain.crt’)是由一个特定的 CA 证书(‘ca.crt’)签署的:

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

个人钥匙

本节涵盖了针对创建和验证私钥的 OpenSSL 命令。

创建私钥

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

1openssl genrsa -des3 -out domain.key 2048

当被要求完成过程时输入密码。

验证私钥

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

1openssl rsa -check -in domain.key

如果你的私钥是加密的,你将被要求通过它的短语. 成功后,未加密的密钥将被输出到终端。

验证私钥匹配证书和CSR

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

1openssl rsa -noout -modulus -in domain.key | openssl md5
2openssl x509 -noout -modulus -in domain.crt | openssl md5
3openssl req -noout -modulus -in domain.csr | openssl md5

如果每个命令的输出是相同的,那么私钥、证书和 CSR 的可能性非常高。

加密私钥

这需要一个未加密的私钥(‘unencrypted.key’)并输出其加密版本(‘encrypted.key’):

1openssl rsa -des3 \
2       -in unencrypted.key \
3       -out encrypted.key

输入您想要的通行句子,以加密私钥。

解密私钥

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

1openssl rsa \
2       -in encrypted.key \
3       -out decrypted.key

请在提示时输入加密密钥的pass 语句。

转换证书格式

我们一直在使用的所有证书都是 ASCII PEM 编码的 X.509 证书. 有各种其他证书编码和容器类型;有些应用程序更喜欢某些格式。

OpenSSL 可用于将证书转换为和从各种各样的这些格式,本节将涵盖一些可能的转换。

将 PEM 转换为 DER

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

1openssl x509 \
2       -in domain.crt \
3       -outform der -out domain.der

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

转换为 PEM

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

1openssl x509 \
2       -inform der -in domain.der \
3       -out domain.crt

将 PEM 转换为 PKCS7

若要将 PEM 证书(‘domain.crt’ 和 ‘ca-chain.crt’)添加到 PKCS7 文件(‘domain.p7b’)时,请使用此命令:

1openssl crl2pkcs7 -nocrl \
2       -certfile domain.crt \
3       -certfile ca-chain.crt \
4       -out domain.p7b

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

PKCS7文件,也被称为P7B,通常用于Java Keystores和Microsoft IIS(Windows)。

将 PKCS7 转换为 PEM

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

1openssl pkcs7 \
2       -in domain.p7b \
3       -print_certs -out domain.crt

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

将 PEM 转换为 PKCS12

使用此命令,如果您想要采取私钥(domain.key)和证书(domain.crt),并将其合并为一个 PKCS12 文件(domain.pfx):

1openssl pkcs12 \
2       -inkey domain.key \
3       -in domain.crt \
4       -export -out domain.pfx

请注意,您可以将证书链添加到 PKCS12 文件中,在这种情况下将证书合并为一个单一的 PEM 文件(domain.crt)。

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

将 PKCS12 转换为 PEM

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

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

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

OpenSSL 版本

可以使用「openssl 版本」命令來檢查您正在執行哪個版本. 您正在執行的 OpenSSL 版本和它所編譯的選項會影響您可用的功能(有時也會影響命令行選項)。

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

1openssl version -a

此指南是使用OpenSSL二进制编写的,包含以下细节(上一个命令的输出):

1OpenSSL 1.1.1 11 Sep 2018
2built on: Mon Aug 23 17:02:39 2021 UTC
3platform: debian-amd64
4options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
5compiler: 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
6OPENSSLDIR: "/usr/lib/ssl"
7ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
8Seeding source: os-specific

结论

这应该涵盖大多数人如何使用OpenSSL与SSL证书一起工作,它有许多其他用途,这些用途在这里没有被涵盖,所以请在评论中询问或建议其他用途。

如果您有任何命令的问题,请确保评论(并包括您的OpenSSL版本输出)。

Published At
Categories with 技术
Tagged with
comments powered by Disqus