介紹
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
):
回答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 版本输出)。