OpenSSL 是一個多功能的命令列工具,可以用於與公鑰基礎設施(PKI)和 HTTPS(HTTP over TLS)相關的大量任務。這本小抄風格的指南提供了 OpenSSL 命令的快速參考,這些命令在常見的日常場景中非常有用。這包括生成私鑰、證書簽署請求(CSR)和證書格式轉換的 OpenSSL 範例,但它並沒有涵蓋 OpenSSL 的所有用途。
\
符號)。如果你想從證書頒發機構(CA)那裡獲得 SSL 證書,你必須生成一個證書簽署請求(CSR)。一個 CSR 主要是由一個金鑰對的公鑰和一些附加資訊組成。當證書被簽署時,這兩部分都會被插入到證書中。
每當你生成一個 CSR 時,你會被提示提供有關證書的資訊。這些資訊被稱為區分名稱(DN)。DN 中的一個重要欄位是通用名稱(CN),它應該是你打算使用證書的主機的完全合格域名(FQDN)。當建立 CSR 時,也可以通過命令列或檔案傳遞資訊來跳過互動式提示。
DN 中的其他專案提供了有關你的業務或組織的附加資訊。如果你是從證書機構購買 SSL 證書,通常要求這些附加欄位(如“組織”)準確地反映你的組織的詳細資訊。
下面是一個 CSR 資訊提示的例子:
---Country Name (2 letter code) [AU]:USState or Province Name (full name) [Some-State]:New YorkLocality Name (eg, city) []:BrooklynOrganization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn CompanyOrganizational Unit Name (eg, section) []:Technology DivisionCommon Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.comEmail Address []:
如果你想非互動式地回答 CSR 資訊提示,你可以通過在任何請求 CSR 資訊的 OpenSSL 命令中新增 -subj
選項來實現。這裡是該選項的一個例子,使用上面程式碼塊中顯示的相同資訊:
-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"
現在你已經了解了 CSR,可以自由跳轉到本指南中涵蓋你的 OpenSSL 需求的任何一節。
本節介紹了與生成 CSR(以及私鑰,如果它們還不存在的話)有關的 OpenSSL 命令。CSR 可以用來向證書頒發機構請求 SSL 證書。
請記住,你可以通過上一節中提到的 -subj
選項非互動式地新增 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
):
openssl req \ -newkey rsa:2048 -nodes -keyout domain.key \ -out domain.csr
回答 CSR 資訊提問,完成該過程。
選項 -newkey rsa:2048
指定金鑰應該是 2048
位,使用 RSA
演算法生成。選項 -nodes
指定私鑰沒有用密碼加密。這裡沒有包含 -new
選項,而是隱含在其中,表示正在生成一個 CSR。
如果你已經有了私鑰,並想用它向 CA 申請證書,請使用這個方法。
該命令基於現有的私鑰(domain.key
)建立一個新的 CSR(domain.csr
):
openssl req \ -key domain.key \ -new -out domain.csr
回答 CSR 資訊提問,完成該過程。
選項 -key
指定一個現有的私鑰(domain.key
),它將被用來生成一個新的 CSR。選項 -new
表示正在生成一個 CSR。
如果你想更新現有的證書,但由於某些原因,你或你的 CA 沒有原始的 CSR,請使用這個方法。基本上可以省去重新輸入 CSR 資訊的麻煩,因為它是從現有證書中提取資訊的。
該命令基於現有的證書(domain.crt
)和私鑰(domain.key
)建立一個新的 CSR(domain.csr
):
openssl x509 \ -in domain.crt \ -signkey domain.key \ -x509toreq -out domain.csr
選項 -x509toreq
指定你使用一個 X509 證書來製作 CSR。
如果你想使用 SSL 證書來確保服務的安全,但你不需要 CA 簽名的證書,一個有效的(和免費的)解決方案是簽署你自己的證書。
你可以自己簽發的一種常見證書是自簽證書。自簽證書是用自己的私鑰簽署的證書。自簽證書和 CA 簽名證書一樣可以用來加密資料,但是你的使用者會顯示一個警告,說這個證書不被他們的計算機或瀏覽器信任。因此,只有當你不需要向使用者證明你的服務身份時,才可以使用自簽名證書(例如非生產或非公開伺服器)。
本節介紹與生成自簽名證書相關的 OpenSSL 命令。
如果你想使用 HTTPS(HTTP over TLS)來保護你的 Apache HTTP 或 Nginx Web 伺服器,並且你不需要你的證書由 CA 簽名,那麼就使用這個方法。
這個命令可以從頭開始建立一個 2048 位的私鑰(domain.key
)和一個自簽證書(domain.crt
):
openssl req \ -newkey rsa:2048 -nodes -keyout domain.key \ -x509 -days 365 -out domain.crt
回答 CSR 資訊提問,完成該過程。
選項 -x509
告訴 req
子命令建立一個自簽名的證書。-days 365
選項指定證書的有效期為 365
天。它會生成一個臨時的 CSR,以收集與證書相關的資訊。
如果你已經有了一個私鑰,並且你想用它來生成一個自簽證書,請使用這個方法。
這條命令可以從現有的私鑰(domain.key
)中建立一個自簽證書(domain.crt
):
openssl req \ -key domain.key \ -new \ -x509 -days 365 -out domain.crt
回答 CSR 資訊提問,完成該過程。
選項 -x509
告訴 req
子命令建立一個自簽證書。-days 365
選項指定證書的有效期為 365
天。選項 -new
啟用 CSR 資訊提問。
如果你已經有了私鑰和 CSR,並且你想用它們生成一個自簽證書,請使用這個方法。
這條命令將從現有的私鑰(domain.key
)和(domain.csr
)中建立一個自簽證書(domain.crt
)。
openssl x509 \ -signkey domain.key \ -in domain.csr \ -req -days 365 -out domain.crt
選項 -days 365
指定證書的有效期為 365
天。
證書和 CSR 檔案是以 PEM 格式編碼的,不適合被人讀取。
本節介紹的 OpenSSL 命令將輸出 PEM 編碼檔案的實際條目。
該命令允許你檢視和驗證純文字的 CSR(domain.csr
)的內容:
openssl req \
-text -noout -verify \
-in domain.csr
該命令允許你檢視純文字證書(domain.crt
)的內容:
openssl x509 \
-text -noout \
-in domain.crt
使用此命令驗證證書(domain.crt
)是否由特定的 CA 證書(ca.crt
)簽署:
openssl verify \
-verbose -CAFile ca.crt \
domain.crt
本節介紹了用於建立和驗證私鑰的 OpenSSL 命令。
使用該命令建立一個受密碼保護的 2048
位私鑰(domain.key
):
openssl genrsa \
-des3 -out domain.key 2048
在提示時輸入密碼以完成該過程。
使用此命令檢查私鑰(domain.key
)是否為有效金鑰:
openssl rsa \
-check -in domain.key
如果你的私鑰已經加密,系統會提示你輸入它的密碼,成功後,未加密的金鑰會在終端上輸出。
使用這些命令來驗證私鑰(domain.key
)是否匹配證書(domain.crt
)和 CSR(domain.csr
):
openssl rsa -noout -modulus -in domain.key | openssl md5openssl x509 -noout -modulus -in domain.crt | openssl md5openssl req -noout -modulus -in domain.csr | openssl md5
如果每條命令的輸出都是相同的,那麼私鑰、證書和 CSR 就極有可能是相關的。
這需要一個未加密的私鑰(unencrypted.key
),並輸出它的加密版本(encrypted.key
):
openssl rsa -des3 \ -in unencrypted.key \ -out encrypted.key
輸入你所需的密碼,以加密私鑰。
這需要一個加密的私鑰(encrypted.key
),並輸出一個解密的版本(decrypted.key
):
openssl rsa \ -in encrypted.key \ -out decrypted.key
在提示時,輸入加密金鑰的密碼。
我們一直在使用的所有證書都是 ASCII 碼 PEM 編碼的 X.509 證書。還有很多其他的證書編碼和容器型別;一些應用程式喜歡某些格式而不是其他格式。此外,這些格式中的許多格式可以在一個檔案中包含多個專案,如私鑰、證書和 CA 證書。
OpenSSL 可以用來將證書在則西格式間轉換。本節將介紹一些可能的轉換。
如果要將 PEM 編碼的證書(domain.crt
)轉換為 DER 編碼的證書(domain.der
),即二進位制格式,請使用此命令:
openssl x509 \ -in domain.crt \ -outform der -out domain.der
DER 格式通常與 Java 一起使用。
如果要將 DER 編碼的證書(domain.der
)轉換為 PEM 編碼的證書(domain.crt
),請使用此命令:
openssl x509 \ -inform der -in domain.der \ -out domain.crt
如果你想把 PEM 證書(domain.crt
和 ca-chain.crt
)新增到 PKCS7 檔案(domain.p7b
)中,請使用該命令:
openssl crl2pkcs7 -nocrl \ -certfile domain.crt \ -certfile ca-chain.crt \ -out domain.p7b
請注意,你可以使用一個或多個 -certfile
選項來指定要新增到 PKCS7 檔案中的證書。
PKCS7 檔案,也被稱為 P7B,通常用於 Java Keystores 和 Microsoft IIS(Windows)。它們是 ASCII 檔案,可以包含證書和 CA 證書。
如果你想將 PKCS7 檔案(domain.p7b
)轉換為 PEM 檔案,請使用該命令:
openssl pkcs7 \ -in domain.p7b \ -print_certs -out domain.crt
請注意,如果你的 PKCS7 檔案中有多個專案(如證書和 CA 中間證書),建立的 PEM 檔案將包含其中的所有專案。
如果你想使用私鑰(domain.key
)和證書(domain.crt
),並將它們組合成一個 PKCS12 檔案(domain.pfx
),請使用這個命令:
openssl pkcs12 \ -inkey domain.key \ -in domain.crt \ -export -out domain.pfx
系統會提示你輸入匯出密碼,你可以留空。請注意,在這種情況下,你可以通過將多個證書連線到一個 PEM 檔案(domain.crt
)中來新增一個證書鏈到 PKCS12 檔案中。
PKCS12 檔案,也被稱為 PFX 檔案,通常用於在 Micrsoft IIS(Windows)中匯入和匯出證書鏈。
如果你想轉換 PKCS12 檔案(domain.pfx
)並將其轉換為 PEM 格式(domain.combined.crt
),請使用此命令:
openssl pkcs12 \ -in domain.pfx \ -nodes -out domain.combined.crt
請注意,如果你的 PKCS12 檔案中有多個專案(如證書和私鑰),建立的 PEM 檔案將包含其中的所有專案。
openssl version
命令可以用來檢查你正在執行的版本。你正在執行的 OpenSSL 版本,以及編譯時使用的選項會影響到你可以使用的功能(有時也會影響到命令列選項)。
下面的命令顯示了你正在執行的 OpenSSL 版本,以及它被編譯時的所有選項:
openssl version -a
本指南是使用具有如下細節的 OpenSSL 二進位制檔案編寫的(參見前面命令的輸出):
OpenSSL 1.0.1f 6 Jan 2014built on: Mon Apr 7 21:22:23 UTC 2014platform: debian-amd64options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASMOPENSSLDIR: "/usr/lib/ssl"
這應該涵蓋了大多數人如何使用 OpenSSL 來處理 SSL 證書的情況!它還有很多其他的用途,在這裡沒有介紹,所以請在評論中隨時詢問或建議其他用途。
如果你在使用這些命令時遇到了問題,請一定要評論(並附上你的 OpenSSL 版本輸出)。