OpenSSL 是一個開源密碼學函式庫,其中包含多種用於 TLS Protocol 和 Public Key Infrastructure 的指令。OpenSSL 於 1998 年發布,適用於 Windows、Linux、macOS 和 BSD 系統。OpenSSL 指令將協助您執行各種任務,包括憑證簽署要求 (CSR)、私鑰產生和 SSL 憑證。
OpenSSL 非常重要,因為它能確保正確的 SSL 實作。以正確的方式取得 SSL 對於您網站的安全至關重要。此外,作為頂級搜尋引擎的 Google 會優先考慮已實作 SSL 憑證的網站。如果您沒有正確的 SSL 憑證,Chrome 和 Firefox 等某些瀏覽器可能會將您的網站標記為「不安全」。因此,透過加密的 HTTPS 協定傳輸網站流量是至關重要的。
首先
本教學是一份速查表風格的指南,其中包含您在日常場景中可能會用到的一些(但可能不是全部)OpenSSL 指令。
第一部分解釋了您需要了解的關於 Certificate Signing Requests (CSR) 的所有資訊。但是,如果您已經對其很熟悉,可以跳到與您要實現的目標相關的任何其他章節。每個章節都包含一個命令列程式碼片段,用以完成副標題所述的操作。
讓我們開始吧!
第 1 節:了解憑證簽署要求 (CSR)
從憑證授權單位 (CA) 取得 SSL 憑證時,憑證簽署要求是先決條件。CSR 包含金鑰對的公鑰和一些附加資訊。您需要在簽署過程中將它們插入到憑證中。
在產生 CSR 的過程中,系統會提示您提供識別資訊,這被稱為識別名稱 (DN)。DN 包含憑證所需的欄位,例如通用名稱 (CN),即將使用該憑證的主機的確切完整網域名稱 (FQDN)。DN 的其他欄位用於填寫附加資訊,例如國家、州/省、地方名稱以及組織或業務名稱(如果您正在產生針對您業務的特定憑證)。您可以選擇透過從檔案或命令列提供資訊來跳過這些提示。
請看下方螢幕截圖中 CSR 資訊提示的範例:
|
1 2 3 4 5 6 7 |
國家 名稱 (2 字母 代碼) [AU]:CH 州 或 省 名稱 (完整 名稱) [Some-State]:Zürich 地方 名稱 (例如, 城市) []:Old Town 組織 名稱 (例如, 公司) [Internet Widgits Pty Ltd]:Example Cloudsigma 公司 組織 單位 名稱 (例如, 部門) []:Cloud Technology 通用 名稱 (e.g. 伺服器 FQDN 或 您的 名稱) []:cloudsigma.com 電子郵件 地址 []:info@cloudsigma.com |
您可以在單行指令中提供資訊,透過新增 -subj 旗標來避免提示(如下所示),並提供各欄位的資訊:
|
1 |
-subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
上述指令採用與 CSR 資訊提示程式碼區塊範例中顯示的相同資訊。
第 2 節:產生憑證簽署要求
在本節中,我們將介紹可用於產生 CSR 和私鑰的 OpenSSL 指令。CSR 是向憑證授權單位 (CA) 申請 SSL 憑證所必需的。
產生私鑰和憑證簽署要求
如果您希望憑證授權單位核發 SSL 憑證以保護您的 Apache 或 Nginx 伺服器以透過 HTTPS(即帶有 TLS 的 HTTP)傳輸流量。使用該指令產生的 CSR 可以發送給 CA 以申請 CA 簽署的 SSL 憑證。您可以按照我們的詳細指南來設定您的 Apache 或 Nginx 伺服器(在 Ubuntu 上)。
在您的終端機中輸入以下指令,以從頭開始產生 2048 位元的私鑰(domain.key)和 CSR(domain.csr):
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr |
根據提示輸入您特定的 CSR 資訊。或者,您可以在指令中加入 -subj 旗標以跳過提示:
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
其中的 -newkey rsa:2048 旗標指定應使用 2048 位元 RSA 演算法產生金鑰。而 -nodes 旗標表示不對私鑰進行密碼加密。另外還有一個 -new 選項雖然未包含在內,但已隱含其中,表示正在產生新的 CSR。
從現有私鑰產生憑證簽署要求 (CSR)
如果您已經有私鑰,則可以使用此方法來產生 CSR。然後,您將使用它向 CA 申請 SSL 憑證。輸入以下指令以使用現有的私鑰(domain.csr)產生新的 CSR(domain.key):
|
1 |
openssl req -key domain.key -new -out domain.csr |
根據提示輸入您特定的 CSR 資訊。或者,您可以將 -subj flag 加入指令中以跳過提示:
|
1 |
openssl req -key domain.key -new -out domain.csr -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
旗標 -key 指定要用於產生新 CSR 的現有私鑰(domain.key)。而 -new 旗標表示正在產生新的 CSR。
從現有憑證和私鑰產生憑證簽署要求 (CSR)
如果您已經有現有的憑證,並想用它來產生 CSR,則可以使用此方法。如果您或您的 CA 遺失了原始 CSR,而您需要使用先前輸入的 CSR 資訊來產生它,而無需重新輸入,則此方法非常有用。該指令會從現有憑證中提取資訊。在您的終端機中輸入以下指令,以使用現有的憑證(domain.csr)並使用現有的 憑證(domain.crt)和現有的私鑰(domain.key):
|
1 |
openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr |
-x509toreq 選項表示您正在使用 X509 憑證 來產生 CSR。
第 3 節:產生 SSL 憑證
在某些情況下,您可能希望使用 SSL 憑證,而免去獲取 CA 簽署憑證的麻煩。本節將說明如何自行簽署憑證。這是有效且免費的。這些憑證被稱為 自我簽署憑證,而且非常常見。
自我簽署憑證是用其自身的私鑰進行簽署的。自我簽署憑證和 CA 簽署憑證在加密數據和網站流量方面的效果一樣好。然而,使用自我簽署憑證時,使用者通常會在瀏覽器中收到該憑證不受信任的警告。因此,您可以在不與使用者交換敏感資訊的網站或非生產伺服器上使用自我簽署憑證。您可以在下方找到可用於產生自我簽署憑證的 OpenSSL 指令。
- 產生自我簽署憑證
您可以使用此方法生成 SSL 憑證來保護您的 Apache 或 Nginx 伺服器。這將確保流量使用 HTTPS 或 HTTP over TLS,而無需前往 CA 簽署憑證:
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt |
請根據提示輸入您特定的 CSR 資訊。您也可以選擇將 -subj flag 新增至命令中以避免出現提示:
|
1 |
openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
The -x509 旗標表示建立自簽署憑證。-days 365 選項指定憑證的有效天數。在此範例中為 365 天。您也可以選擇不同的天數。該命令會生成一個臨時 CSR,以保存您應與憑證關聯的資訊。
- 從現有私鑰生成自簽署憑證
此方法將協助您從現有的私鑰生成自簽署憑證。輸入以下命令以生成自簽署憑證 (domain.crt),並使用現有的私鑰 (domain.key):
|
1 |
openssl req -key domain.key -new -x509 -days 365 -out domain.crt |
請在提示中提供您特定的 CSR 資訊。您也可以選擇將 -subj flag 新增至命令中以避免出現提示:
|
1 |
openssl req -key domain.key -new -x509 -days 365 -out domain.crt -subj "/C=CH/ST=Zürich/L=Old Town/O=Example Cloudsigma Company/CN=cloudsigma.com" |
The -x509 旗標表示建立自簽署憑證。-days 365 選項指定憑證的有效天數。在此範例中為 365 天。您也可以選擇不同的天數。-new 選項會啟動 CSR 資訊提示。
第 4 節:檢視憑證
憑證和 CSR 檔案會進行編碼並以 .pem 副檔名儲存。它代表隱私增強郵件(Privacy-Enhanced Mail)。這是一種用於儲存和傳送密碼金鑰、憑證和其他關鍵資料的檔案格式。PEM 檔案無法直接由人類閱讀。在本節中,您將找到可用於檢視編碼 PEM 檔案中項目的命令。
- 檢視 CSR 檔案
輸入以下命令以在終端機上檢視並驗證 CSR (domain.csr) 的內容:
|
1 |
openssl req -text -noout -verify -in domain.csr |
例如,上述命令可能會輸出類似以下的內容:

- 檢視憑證項目
輸入以下命令以檢視憑證 (domain.crt):
|
1 |
openssl x509 -text -noout -in domain.crt |
上述命令可能會輸出類似以下的內容:

- 驗證憑證是否由憑證授權單位簽署
要驗證憑證 (domain.crt) 是否由某個 CA 憑證 (ca.crt) 簽署,請輸入以下命令:
|
1 |
openssl verify -verbose -CAfile ca.crt domain.crt |
第 5 節:私鑰
如果您正在尋找建立和驗證私鑰所需的 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 2 3 |
openssl rsa -noout -modulus -in domain.key | openssl md5 openssl x509 -noout -modulus -in domain.crt | openssl md5 openssl req -noout -modulus -in domain.csr | openssl md5 |
如果您發現上述命令的輸出完全相同,那麼該私鑰、憑證和 CSR 很可能是相關聯的。
- 加密私鑰
如果您有一個未加密的私鑰(unencrypted.key)且您想獲取該金鑰的加密版本(encrypted.key),請在終端機中輸入以下命令:
|
1 |
openssl rsa -des3 -in unencrypted.key -out encrypted.key |
該命令將提示您輸入密碼短語以加密私鑰。
- 解密私鑰
如果您有一個已加密的私鑰(encrypted.key)且您想獲取其解密版本(decrypted.key),請在終端機中輸入以下命令:
|
1 |
openssl rsa -in encrypted.key -out decrypted.key |
該命令將提示您輸入加密金鑰的密碼短語。如果您輸入正確的密碼短語,它將被解密。輸出將儲存至 decrypted.key.
第 6 節:轉換憑證格式
您可能會注意到,到目前為止我們一直在使用 X.509 憑證,這些憑證是使用 ASCII PEM 編碼的。雖然這沒問題,但您還可以使用許多其他憑證編碼和容器類型。在某些應用程式中,您可能更傾向於使用某些特定格式。此外,一些不同的格式可以在一個檔案中包含多個項目,例如私鑰、CSR 和 CA 簽署的憑證。您還可以使用 OpenSSL 在各種憑證格式之間進行轉換。請繼續閱讀以了解一些用於憑證格式轉換的 OpenSSL 命令。
- 將 PEM 轉換為 DER
DER (Distinguished Encoding Rules) 是一種用於 X.509 憑證和私鑰的二進位編碼。要將 PEM 編碼的憑證(domain.crt)轉換為 DER 編碼的憑證(domain.der),請輸入以下命令:
|
1 |
openssl x509 -in domain.crt -outform der -out domain.der |
您會發現 DER 編碼格式的大多數使用場景都在 Java 程式語言 中。請參考此 在 Ubuntu 伺服器上快速設定 Java 的教學.
- 將 DER 轉換為 PEM
要將 DER 編碼的憑證(domain.der)轉換為 PEM 憑證(domain.crt),請輸入以下命令:
|
1 |
openssl x509 -inform der -in domain.der -out domain.crt<code> |
- 將 PEM 轉換為 PKCS7
您可能想要將 PEM 憑證(例如 domain.crt 和 ca-chain.crt)新增到 PKCS7 檔案(domain.p7b)中。以下是實現此操作的命令:
|
1 |
openssl crl2pkcs7 -nocrl -certfile domain.crt -certfile ca-chain.crt -out domain.p7b |
您可以使用 -certfile 選項多次,以指定要新增到 PKCS7 檔案中的憑證。PKCS7 檔案主要與 Java 金鑰庫 (Java Key stores) 和 Microsoft IIS 相關。它們也被稱為 P7B 檔案,是包含憑證和 CA 簽署憑證的 ASCII 檔案。
- 將 PKCS7 轉換為 PEM
要將 PKCS7 檔案(domain.p7b)轉換為 PEM 編碼檔案(domain.crt),請在終端機中輸入以下命令:
|
1 |
openssl pkcs7 -in domain.p7b -print_certs -out domain.crt |
- 將 PEM 轉換為 PKCS12
要將私鑰(domain.key)和憑證(domain.crt)合併為一個 PKCS12 檔案 (domain.pfx),請輸入以下命令:
|
1 |
openssl pkcs12 -inkey domain.key -in domain.crt -export -out domain.pfx |
該命令將提示您輸入匯出密碼,您也可以選擇留空。您可以透過將多個憑證合併到單個 PEM 檔案 (domain.crt) 中,來將多個憑證鏈結到 PKCS12 檔案。PKCS12 也稱為 PFX,主要用於 Microsoft IIS.
- 將 PKCS12 轉換為 PEM
要將 PKCS12 檔案 (domain.pfx) 轉換為 PEM 編碼格式 (domain.combined.crt),請輸入以下命令:
|
1 |
openssl pkcs12 -in domain.pfx -nodes -out domain.combined.crt |
由上述命令建立的 PEM 檔案包含該 PKCS12 所包含的所有多個項目。
第 7 節:檢查 OpenSSL 版本
您運行的任何軟體版本都可能會影響您運行的應用程式功能。因此,有必要確定其版本。OpenSSL 也是如此。某些命令列選項可能在某個版本中缺失,但在另一個版本中可用。要查看您正在運行的 OpenSSL 版本,請輸入以下命令:
|
1 |
openssl version -a |
以下是我們在製作本教學時運行上述命令所獲得的輸出:
|
1 2 3 4 5 6 7 8 |
OpenSSL 1.1.1i 8 Dec 2020 built on: Sat Dec 19 15:39:47 2020 UTC platform: linux-x86_64 options: bn(64,64) rc4(16x,int) des(int) idea(int) blowfish(ptr) compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O3 -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 -DAESNI_ASM -DVPAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPOLY1305_ASM -DNDEBUG OPENSSLDIR: "/usr/local/ssl" ENGINESDIR: "/usr/local/lib/engines-1.1" Seeding source: os-specific |
您可以在下方找到實際的螢幕截圖:

結論
在本教學中,我們解釋了什麼是 OpenSSL,介紹了憑證簽署要求 (CSR) 以及一些您可以在伺服器環境中使用的重要 OpenSSL 命令。
我們是否遺漏了某個重要命令,或者您在設定以下平台上的伺服器時遇到任何命令問題:CloudSigma?歡迎隨時聯絡我們的24/7 客戶支援團隊 進行即時對談以討論此問題。
祝您運算愉快!
留言
目前尚無留言。成為第一個留言的人吧。