介绍
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版本输出)。