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。
通過網頁,送出了網站資訊後,系統生成了公鑰和私鑰,以及CSR檔案,這裡隻暴露了私鑰和CSR檔案。
1.2)CSR檔案是什麼樣子?
CSR是一個base64格式的一串字元串,并且以-----BEGIN CERTIFICATE REQUEST-----開頭,并以-----END CERTIFICATE REQUEST-----為結尾。如下圖
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 資訊提示的例子:
如果想非互動式地回答 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
2)無加密産生公鑰
$openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
說明:根據私鑰生成公鑰
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 "}"