介绍
OpenSSL是一个多功能的命令行工具,可用于与公钥基础设施(PKI)和HTTPS(HTTP over TLS)相关的各种任务。这个速查表样式指南提供了 OpenSSL 命令的快速参考,这些命令在常见的日常场景中非常有用。这包括生成私钥、证书签名请求和证书格式转换的 OpenSSL 示例。它不涵盖 OpenSSL 的所有用途。
如何使用本指南:
- 如果您不熟悉证书签名请求(CSRs),请阅读第一部分
- 除了第一部分外,本指南采用速查表格式:一系列独立的命令行片段
- 跳转到与您要完成的任务相关的任何部分(提示:使用目录菜单或您浏览器的查找功能)
- 大多数命令都是一行命令,已展开为多行(使用
\
符号)以提高清晰度
关于证书签名请求(CSRs)
如果您想从商业证书颁发机构(CA)获得SSL证书,则必须生成证书签名请求(CSR)。CSR主要由密钥对的公钥和一些附加信息组成。这些组件在签名证书时都会被插入。
每当您生成CSR时,系统都会提示您提供有关证书的信息。这些信息被称为Distinguished Name(DN)。DN中的一个重要字段是通用名称(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(TLS上的HTTP)来保护您的Apache HTTP或Nginx web服务器,并且想要使用证书颁发机构(CA)颁发SSL证书,则可以使用此方法。生成的CSR可以发送给CA请求颁发CA签名的SSL证书。如果您的CA支持SHA-2,请添加-sha256
选项以使用SHA-2签署CSR。
此命令从头开始创建一个2048位的私钥(domain.key
)和一个CSR(domain.csr
):
回答CSR信息提示以完成该过程。
-newkey rsa:2048
选项指定密钥应为 2048 位,使用 RSA 算法生成。 -nodes
选项指定私钥不应使用密码短语加密。不包含在这里但隐含的 -new
选项表示正在生成 CSR。
从现有私钥生成 CSR
如果您已经有一个私钥,想要用它来向 CA 请求证书,请使用此方法。
此命令基于现有私钥 (domain.key
) 创建一个新的 CSR (domain.csr
):
回答 CSR 信息提示以完成流程。
-key
选项指定一个现有私钥 (domain.key
),用于生成新的 CSR。 -new
选项表示正在生成 CSR。
从现有证书和私钥生成 CSR
如果您想要更新现有证书但您或您的CA因某种原因没有原始CSR,则可以使用此方法。基本上,它可以帮助您省去重新输入CSR信息的麻烦,因为它会从现有证书中提取该信息。
该命令将基于现有证书(domain.crt
)和私钥(domain.key
)创建一个新的CSR(domain.csr
):
-x509toreq
选项指定您正在使用X509证书创建CSR。
生成SSL证书
如果您想要使用SSL证书来保护服务,但不需要CA签名的证书,一个有效的(并且免费)解决方案是签发自己的证书。
A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).
本节介绍与生成自签名证书相关的OpenSSL命令。
生成自签名证书
如果您想要使用HTTPS(HTTP over TLS)来保护您的Apache HTTP或Nginx web服务器,而且您不需要您的证书由CA签名,则可以使用此方法。
这个命令从头开始创建一个2048位的私钥(domain.key
)和一个自签名证书(domain.crt
):
按照CSR信息提示来完成这个过程。
-x509
选项告诉req
创建一个自签名证书。-days 365
选项指定证书的有效期为365天。生成一个临时的CSR以收集与证书关联的信息。
从现有私钥生成自签名证书
如果您已经有一个私钥,想要用它生成一个自签名证书,请使用这种方法。
这个命令从现有私钥(domain.key
)创建一个自签名证书(domain.crt
):
按照CSR信息提示来完成这个过程。
-x509
选项告诉req
创建一个自签名证书。-days 365
选项指定证书的有效期为365天。-new
选项启用CSR信息提示。
从现有的私钥和CSR生成自签名证书
如果您已经拥有私钥和CSR,并且希望使用它们生成自签名证书,请使用此方法。
此命令从现有私钥(domain.key
)和(domain.csr
)创建自签名证书(domain.crt
):
-days 365
选项指定证书的有效期为365天。
查看证书
证书和CSR文件以PEM格式编码,不易于人类阅读。
本部分介绍了将输出PEM编码文件的实际条目的OpenSSL命令。
查看CSR条目
此命令允许您查看和验证CSR(domain.csr
)的内容:
查看证书条目
此命令允许您查看证书(domain.crt
)的内容:
验证证书是否由CA签名
使用此命令验证证书(domain.crt
)是否由特定的CA证书(ca.crt
)签名:
私钥
此部分涵盖了特定于创建和验证私钥的OpenSSL命令。
创建私钥
使用此命令创建一个2048位的受密码保护的私钥(domain.key
):
按提示输入密码以完成该过程。
验证私钥
使用此命令检查私钥(domain.key
)是否为有效密钥:
如果您的私钥已加密,系统将提示您输入密码。验证成功后,将在终端输出未加密的密钥。
验证私钥与证书和CSR的匹配
使用这些命令验证私钥(domain.key
)是否与证书(domain.crt
)和CSR(domain.csr
)匹配:
如果每个命令的输出相同,则私钥、证书和CSR之间可能存在极高的相关性。
加密私钥
此命令将未加密的私钥(unencrypted.key
)转换为加密版本(encrypted.key
):
请输入您希望使用的密码来加密私钥。
解密私钥
这将接受一个加密的私钥(encrypted.key
)并输出其解密版本(decrypted.key
):
在提示时输入加密密钥的密码。
转换证书格式
我们一直在使用的所有证书都是ASCII PEM编码的X.509证书。还有各种其他证书编码和容器类型;一些应用程序更喜欢某些格式。此外,许多这些格式可以在单个文件中包含多个项目,如私钥、证书和CA证书。
可以使用 OpenSSL 将证书转换为各种这些格式之一,并从这些格式之一转换。本节将介绍一些可能的转换。
将 PEM 转换为 DER
如果您想将 PEM 编码的证书(domain.crt
)转换为 DER 编码的证书(domain.der
),即二进制格式,请使用此命令:
DER格式通常与Java一起使用。
将DER转换为PEM
如果您想将DER编码的证书(domain.der
)转换为PEM编码的证书(domain.crt
),请使用以下命令:
将PEM转换为PKCS7
如果您想将PEM证书(domain.crt
和ca-chain.crt
)添加到PKCS7文件(domain.p7b
),请使用以下命令:
请注意,您可以使用一个或多个-certfile
选项来指定要添加到PKCS7文件的证书。
PKCS7文件,也称为P7B,通常用于Java密钥库和Microsoft IIS(Windows)。它们是包含证书和CA证书的ASCII文件。
将PKCS7转换为PEM
如果您想将PKCS7文件(domain.p7b
)转换为PEM文件,请使用以下命令:
请注意,如果您的PKCS7文件中包含多个项目(例如证书和CA中间证书),则创建的PEM文件将包含其中的所有项目。
将PEM转换为PKCS12
如果您想要将私钥(domain.key
)和证书(domain.crt
)合并为PKCS12文件(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 版本输出)。