Linux中國

OpenSSL 精粹:SSL 證書、私鑰和 CSR

介紹

OpenSSL 是一個多功能的命令行工具,可以用於與 公鑰基礎設施 Public Key Infrastructure (PKI)和 HTTPS(HTTP over TLS)相關的大量任務。這本小抄風格的指南提供了 OpenSSL 命令的快速參考,這些命令在常見的日常場景中非常有用。這包括生成私鑰、 證書簽署請求 certificate signing request (CSR)和證書格式轉換的 OpenSSL 示例,但它並沒有涵蓋 OpenSSL 的所有用途。

如何使用本指南

  • 如果你不熟悉證書籤署請求(CSR),請閱讀第一部分。
  • 除了第一部分,本指南採用了簡單的小抄格式:自帶了命令行代碼片段。
  • 跳到與你準備完成的任務相關的任何部分。
  • 大多數命令都是單行的,為了清晰起見,已經擴展到多行(使用 `` 符號)。

關於證書籤署請求(CSR)

如果你想從 證書頒發機構 certificate authority (CA)那裡獲得 SSL 證書,你必須生成一個 證書籤署請求 certificate signing request (CSR)。一個 CSR 主要是由一個密鑰對的公鑰和一些附加信息組成。當證書被簽署時,這兩部分都會被插入到證書中。

每當你生成一個 CSR 時,你會被提示提供有關證書的信息。這些信息被稱為 區分名稱 Distinguised Name (DN)。DN 中的一個重要欄位是 通用名稱 Common Name (CN),它應該是你打算使用證書的主機的 完全合格域名 Fully Qualified Domain Name (FQDN)。當創建 CSR 時,也可以通過命令行或文件傳遞信息來跳過互動式提示。

DN 中的其他項目提供了有關你的業務或組織的附加信息。如果你是從證書機構購買 SSL 證書,通常要求這些附加欄位(如「 組織 Organization 」)準確地反映你的組織的詳細信息。

下面是一個 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):

openssl req 
       -newkey rsa:2048 -nodes -keyout domain.key 
       -out domain.csr

回答 CSR 信息提問,完成該過程。

選項 -newkey rsa:2048 指定密鑰應該是 2048 位,使用 RSA 演算法生成。選項 -nodes 指定私鑰沒有用密碼加密。這裡沒有包含 -new 選項,而是隱含在其中,表示正在生成一個 CSR。

從現有的私鑰中生成一個 CSR

如果你已經有了私鑰,並想用它向 CA 申請證書,請使用這個方法。

該命令基於現有的私鑰(domain.key)創建一個新的 CSR(domain.csr):

openssl req 
       -key domain.key 
       -new -out domain.csr

回答 CSR 信息提問,完成該過程。

選項 -key 指定一個現有的私鑰(domain.key),它將被用來生成一個新的 CSR。選項 -new 表示正在生成一個 CSR。

從現有的證書和私鑰生成 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 證書

如果你想使用 SSL 證書來確保服務的安全,但你不需要 CA 簽名的證書,一個有效的(和免費的)解決方案是簽署你自己的證書。

你可以自己簽發的一種常見證書是 自簽證書 self-signed certificate 。自簽證書是用自己的私鑰簽署的證書。自簽證書和 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 生成自簽證書

如果你已經有了私鑰和 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 條目

該命令允許你查看和驗證純文本的 CSR(domain.csr)的內容:

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

查看證書條目

該命令允許你查看純文本證書(domain.crt)的內容:

openssl x509   
       -text -noout   
       -in domain.crt

驗證證書由 CA 簽署

使用此命令驗證證書(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

如果你的私鑰已經加密,系統會提示你輸入它的密碼,成功後,未加密的密鑰會在終端上輸出。

驗證私鑰是否與證書和 CSR 匹配

使用這些命令來驗證私鑰(domain.key)是否匹配證書(domain.crt)和 CSR(domain.csr):

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

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 轉換為 DER

如果要將 PEM 編碼的證書(domain.crt)轉換為 DER 編碼的證書(domain.der),即二進位格式,請使用此命令:

openssl x509 
       -in domain.crt 
       -outform der -out domain.der

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

將 DER 轉換為 PEM

如果要將 DER 編碼的證書(domain.der)轉換為 PEM 編碼的證書(domain.crt),請使用此命令:

openssl x509 
       -inform der -in domain.der 
       -out domain.crt

將 PEM 轉換為 PKCS7

如果你想把 PEM 證書(domain.crtca-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 轉換為 PEM

如果你想將 PKCS7 文件(domain.p7b)轉換為 PEM 文件,請使用該命令:

openssl pkcs7 
       -in domain.p7b 
       -print_certs -out domain.crt

請注意,如果你的 PKCS7 文件中有多個項目(如證書和 CA 中間證書),創建的 PEM 文件將包含其中的所有項目。

將 PEM 轉換為 PKCS12

如果你想使用私鑰(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 轉換為 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.0.1f 6 Jan 2014
built on: Mon Apr  7 21:22:23 UTC 2014
platform: debian-amd64
options:  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_ASM
OPENSSLDIR: "/usr/lib/ssl"

總結

這應該涵蓋了大多數人如何使用 OpenSSL 來處理 SSL 證書的情況!它還有很多其他的用途,在這裡沒有介紹,所以請在評論中隨時詢問或建議其他用途。

如果你在使用這些命令時遇到了問題,請一定要評論(並附上你的 OpenSSL 版本輸出)。

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

作者:Mitchell Anicas 選題:wxy 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國