天天看點

openssl之SSL簽名相關介紹

1、CSR是什麼?

CSR是英文Certificate Signing Request的縮寫,即證書簽名請求。CSR檔案是申請SSL證書時所需要的一個資料檔案,下面将為你詳細介紹CSR檔案的具體内容。

數字證書的核心,其實就是非對稱加密,也就是公私鑰對加密。非對稱加密之是以安全,前提條件是使用者必須要保障私鑰的安全。是以在使用者向CA申請數字證書時,使用者首先需要在自己的電腦中先産生一個公私鑰對。使用者需要保管好自己的私鑰,然後再把公鑰和你的個人資訊發送給CA機構,CA機構通過你的公鑰和個人資訊最終簽發出數字證書。

而CSR檔案,其實就是包含了使用者公鑰和個人資訊的一個資料檔案。使用者産生出這個CSR檔案,再把這個CSR檔案發送給CA,CA就會根據CSR中的内容來簽發出數字證書。

1.1)如何生成CSR檔案?

要産生CSR檔案目前有很多種方法,比較常用的有OpenSSL工具、Keystore Explore等等,在網上搜尋就能很容易地找到。而目前更多人常用的一般是線上産生CSR。一般的CA機構都會提供線上生成CSR的功能,如:https://myssl.com/csr_create.html。

openssl之SSL簽名相關介紹

通過網頁,送出了網站資訊後,系統生成了公鑰和私鑰,以及CSR檔案,這裡隻暴露了私鑰和CSR檔案。

1.2)CSR檔案是什麼樣子?

CSR是一個base64格式的一串字元串,并且以-----BEGIN CERTIFICATE REQUEST-----開頭,并以-----END CERTIFICATE REQUEST-----為結尾。如下圖

openssl之SSL簽名相關介紹

2、openssl介紹、使用

OpenSSL 是一個多功能的指令行工具,可以用于與 公鑰基礎設施(Public Key Infrastructure)(PKI)和 HTTPS(HTTP over TLS)相關。這包括生成私鑰、 證書簽署請求(certificate signing request)(CSR)和證書格式轉換的 OpenSSL 示例。

2.1)關于證書簽署請求(CSR)

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

下面是一個 CSR 資訊提示的例子:

openssl之SSL簽名相關介紹

如果想非互動式地回答 CSR 資訊提示,可以通過 -subj 選項來實作。例如:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

2.2)openssl生成公鑰和私鑰

1)無加密産生私鑰

openssl genrsa -out rsa_private_key.pem 1024

openssl之SSL簽名相關介紹

2)無加密産生公鑰

$openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

說明:根據私鑰生成公鑰

openssl之SSL簽名相關介紹

3)生成受密碼保護的RSA私鑰

$openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048

其中,passout代替shell進行密碼輸入,否則會提示輸入密碼

4)生成受密碼保護的RSA公鑰

$openssl rsa -in rsa_aes_private.key -pubout -out rsa_public.key

Enter pass phrase for rsa_aes_private.key:

writing RSA key

第二種非互動方式

$openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_public.key

writing RSA key

5)轉換指令

檢視秘鑰明細

$openssl rsa -in rsa_private.key -noout -text

私鑰轉非加密

openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_private.key

私鑰轉加密

openssl rsa -in rsa_private.key -aes256 -passout pass:111111 -out rsa_aes_private.key

私鑰PEM轉DER

openssl rsa -in rsa_private.key -outform der -out rsa_aes_private.der

-inform和-outform 參數制定輸入輸出格式,由der轉pem格式同理

檢視公鑰明細

$openssl rsa -pubin -in rsa_public_key.pem -noout -text

​​參考: Linux專題—openssl生成公鑰和私鑰 - 知乎​​

2.3)生成CSR

下面介紹如何使用openssl生成CSR。

1)生成一個私鑰和一個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。

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

如果你已經有了私鑰,并想用它向 CA 申請證書,請使用這個方法。該指令基于現有的私鑰(domain.key)建立一個新的 CSR(domain.csr):

openssl req \

-key domain.key \

-new -out domain.csr

回答 CSR 資訊提問,完成該過程。

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

說明:openssl可以根據私鑰生成公鑰。

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

2.4)生成SSL證書

如果想使用 SSL 證書來確定服務的安全,但不需要 CA 簽名的證書,一個有效的(和免費的)解決方案是簽署你自己的證書,即:自簽證書(self-signed certificate)。自簽證書是用自己的私鑰簽署的證書。自簽證書和 CA 簽名證書一樣可以用來加密資料,但是你的使用者會顯示一個警告,說這個證書不被他們的計算機或浏覽器信任。是以,隻有當你不需要向使用者證明你的服務身份時,才可以使用自簽名證書(例如非生産或非公開伺服器)。

1)生成自簽證書

如果你想使用 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,以收集與證書相關的資訊。

2)從現有私鑰生成自簽名證書

如果你已經有了一個私鑰,并且你想用它來生成一個自簽證書,請使用這個方法。這條指令可以從現有的私鑰(domain.key)中建立一個自簽證書(domain.crt):

openssl req \

-key domain.key \

-new \

-x509 -days 365 -out domain.crt

回答 CSR 資訊提問,完成該過程。

選項 -x509 告訴 req 子指令建立一個自簽證書。-days 365 選項指定證書的有效期為 365 天。選項 -new 啟用 CSR 資訊提問。

3)從現有的私鑰和 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 天。

2.5)檢視證書

證書和 CSR 檔案是以 PEM 格式編碼的,不适合被人讀取。本節介紹的 OpenSSL 指令将輸出 PEM 編碼檔案的實際條目。

1)檢視 CSR 條目

該指令允許你檢視和驗證純文字的 CSR(domain.csr)的内容:

openssl req \

-text -noout -verify \

-in domain.csr

2)檢視證書條目

該指令允許你檢視純文字證書(domain.crt)的内容:

openssl x509 \

-text -noout \

-in domain.crt

3)驗證證書由 CA 簽署

使用此指令驗證證書(domain.crt)是否由特定的 CA 證書(ca.crt)簽署:

openssl verify \

-verbose -CAFile ca.crt \

domain.crt

2.6)私鑰

本節介紹了用于建立和驗證私鑰的 OpenSSL 指令。

1)建立私鑰

使用該指令建立一個受密碼保護的 2048 位私鑰(domain.key):

openssl genrsa \

-des3 -out domain.key 2048

在提示時輸入密碼以完成該過程。

2)驗證私鑰

使用此指令檢查私鑰(domain.key)是否為有效密鑰:

openssl rsa \

-check -in domain.key

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

3)驗證私鑰是否與證書和 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 就極有可能是相關的。

4)加密私鑰

這需要一個未加密的私鑰(unencrypted.key),并輸出它的加密版本(encrypted.key):

openssl rsa -des3 \

-in unencrypted.key \

-out encrypted.key

輸入你所需的密碼,以加密私鑰。

5)解密私鑰

這需要一個加密的私鑰(encrypted.key),并輸出一個解密的版本(decrypted.key):

openssl rsa \

-in encrypted.key \

-out decrypted.key

在提示時,輸入加密密鑰的密碼。

2.7)轉換證書格式

我們一直在使用的所有證書都是 ASCII 碼 PEM 編碼的 X.509 證書。還有很多其他的證書編碼和容器類型;一些應用程式喜歡某些格式而不是其他格式。此外,這些格式中的許多格式可以在一個檔案中包含多個項目,如私鑰、證書和 CA 證書。

OpenSSL 可以用來将證書在則西格式間轉換。本節将介紹一些可能的轉換。

1)将 PEM 轉換為 DER

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

openssl x509 \

-in domain.crt \

-outform der -out domain.der

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

2)将 DER 轉換為 PEM

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

openssl x509 \

-inform der -in domain.der \

-out domain.crt

将 PEM 轉換為 PKCS7

3)如果你想把 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 證書。

4)将 PKCS7 轉換為 PEM

如果你想将 PKCS7 檔案(domain.p7b)轉換為 PEM 檔案,請使用該指令:

openssl pkcs7 \

-in domain.p7b \

-print_certs -out domain.crt

請注意,如果你的 PKCS7 檔案中有多個項目(如證書和 CA 中間證書),建立的 PEM 檔案将包含其中的所有項目。

5)将 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)中導入和導出證書鍊。

6)将 PKCS12 轉換為 PEM

如果你想轉換 PKCS12 檔案(domain.pfx)并将其轉換為 PEM 格式(domain.combined.crt),請使用此指令:

openssl pkcs12 \

-in domain.pfx \

-nodes -out domain.combined.crt

#!/bin/sh

# create self-signed server certificate:

read -p "Enter your domain [www.example.com]: " DOMAIN

echo "Create server key..."

openssl genrsa -des3 -out $DOMAIN.key 1024



echo "Create server certificate signing request..."

SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"

openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr



echo "Remove password..."

mv $DOMAIN.key $DOMAIN.origin.key

openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key



echo "Sign SSL certificate..."

openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt



echo "TODO:"

echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt"

echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"

echo "Add configuration in nginx:"

echo "server {"

echo " ..."

echo " listen 443 ssl;"

echo " ssl_certificate /etc/nginx/ssl/$DOMAIN.crt;"

echo " ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;"

echo "}"      

繼續閱讀