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

介紹

OpenSSL 是一個多用途的命令行工具,可用於與公開金鑰基礎設施(PKI)和 HTTPS(HTTP over TLS)相關的各種任務。這份速查表風格的指南提供了 OpenSSL 命令的快速參考,這些命令在常見的日常場景中很有用。這包括用於生成私鑰、證書簽名請求和證書格式轉換的 OpenSSL 示例。它不涵蓋 OpenSSL 的所有用途。

如何使用本指南:

  • 如果您不熟悉證書簽名請求(CSRs),請閱讀第一節
  • 除第一節外,本指南以速查表格式呈現:一個自包含的命令行片段列表
  • 跳轉至任何與您正在完成的任務相關的部分(提示:使用目錄菜單或您瀏覽器的尋找功能)
  • 大部分命令都是一行命令,已展開為多行(使用\符號)以提高清晰度

關於證書簽名請求(CSRs)

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

每当您生成CSR时,您将被提示提供有关证书的信息。此信息称为专有名称(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信息提示,可以通过向请求CSR信息的任何OpenSSL命令添加-subj选项来执行此操作。以下是使用与上面代码块中显示的相同信息的选项示例:

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

  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