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

介绍

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

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

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

-newkey rsa:2048 选项指定密钥应为 2048 位,使用 RSA 算法生成。 -nodes 选项指定私钥不应使用密码短语加密。包含在这里但隐含的 -new 选项表示正在生成 CSR。

从现有私钥生成 CSR

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

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

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

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

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

从现有证书和私钥生成 CSR

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

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

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out 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):

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

按照CSR信息提示来完成这个过程。

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

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

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

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

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

按照CSR信息提示来完成这个过程。

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

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

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

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

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

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

查看证书

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

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

查看CSR条目

此命令允许您查看和验证CSR(domain.csr)的内容:

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

查看证书条目

此命令允许您查看证书(domain.crt)的内容:

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

验证证书是否由CA签名

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

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

私钥

此部分涵盖了特定于创建和验证私钥的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. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

如果每个命令的输出相同,则私钥、证书和CSR之间可能存在极高的相关性。

加密私钥

此命令将未加密的私钥(unencrypted.key)转换为加密版本(encrypted.key):

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

请输入您希望使用的密码来加密私钥。

解密私钥

这将接受一个加密的私钥(encrypted.key)并输出其解密版本(decrypted.key):

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

在提示时输入加密密钥的密码。

转换证书格式

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

可以使用 OpenSSL 将证书转换为各种这些格式之一,并从这些格式之一转换。本节将介绍一些可能的转换。

将 PEM 转换为 DER

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

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

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

将DER转换为PEM

如果您想将DER编码的证书(domain.der)转换为PEM编码的证书(domain.crt),请使用以下命令:

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

将PEM转换为PKCS7

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

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

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

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

将PKCS7转换为PEM

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

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

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

将PEM转换为PKCS12

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

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -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 版本输出)。

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs