@[toc]
一焕妙、背景
正常項目的私鑰和服務(wù)端證書會放在項目中或者外掛到linux服務(wù)器某個路徑下吃挑,現(xiàn)在的需求是客戶手動創(chuàng)建的新的證書,替換后項目證書仍然生效,且功能能正常使用籽慢。
目前我司采用nginx配置SSL通信驗證,具體配置在nginx安裝路徑下的nginx.conf文件猫胁,最終修改的地方是紅框這里箱亿。
1.1 秘鑰和證書是兩個東西嗎?
是的杜漠,密鑰(Key)和證書(Certificate)是兩個不同的概念极景,但它們在安全通信中通常是相關(guān)聯(lián)的。
密鑰(Key):
密鑰是用于加密和解密數(shù)據(jù)的一種數(shù)學算法驾茴。
在SSL/TLS通信中,有兩種主要類型的密鑰:公鑰和私鑰氢卡。
私鑰(Private Key)用于對數(shù)據(jù)進行加密和對由公鑰加密的數(shù)據(jù)進行解密锈至。私鑰必須保密,只有持有私鑰的一方才能解密數(shù)據(jù)译秦。
公鑰(Public Key)用于對數(shù)據(jù)進行解密和對由私鑰加密的數(shù)據(jù)進行加密峡捡。公鑰通常公開發(fā)布,用于與其他人安全地通信筑悴。
證書(Certificate):
證書是由數(shù)字證書頒發(fā)機構(gòu)(CA)簽發(fā)的一種電子文件们拙,用于驗證服務(wù)器或客戶端的身份。
證書包含了一些重要的信息阁吝,如公鑰砚婆、頒發(fā)者、有效期等突勇。
證書可以用來確保通信雙方的身份装盯,防止中間人攻擊等安全威脅。
在SSL/TLS通信中甲馋,密鑰和證書通常是配對使用的埂奈。服務(wù)器會持有私鑰,并將其與公鑰證書一起使用以向客戶端證明其身份定躏≌嘶牵客戶端則使用服務(wù)器的公鑰證書來驗證服務(wù)器的身份,并用于加密通信痊远。
1.2 介紹下nginx配置文件中參數(shù)ssl_certificate和ssl_certificate_key
答案:ssl_certificate指向的是“服務(wù)端證書”相對路徑垮抗,而ssl_certificate_key指向的是“私鑰”相對路徑。
1.3介紹下nginx支持的證書類型
目前市面上數(shù)字證書可以以多種不同的后綴格式保存拗引,常見的包括:
PEM(Privacy Enhanced Mail)
:PEM 格式是一種常見的 ASCII 編碼格式借宵,通常用于存儲證書、密鑰和其他相關(guān)數(shù)據(jù)矾削。PEM 格式的文件通常以 .pem壤玫、.cer豁护、.crt 或 .key 結(jié)尾。DER(Distinguished Encoding Rules)
:DER 格式是一種二進制編碼格式欲间,通常用于表示 X.509 數(shù)字證書楚里。DER 格式的文件通常以 .der 或 .cer 結(jié)尾。PKCS#12
:PKCS#12 是一種可將證書和私鑰打包成單個加密文件的格式猎贴。PKCS#12 格式的文件通常以 .p12 或 .pfx 結(jié)尾班缎。JKS(Java KeyStore)
:JKS 格式是 Java 中用于存儲密鑰和證書的專有格式。JKS 格式的文件通常以 .jks 結(jié)尾她渴。PFX(Personal Information Exchange)
:PFX 格式與 PKCS#12 格式類似达址,用于將證書和私鑰打包成單個文件,通常以 .pfx 結(jié)尾趁耗。PKCS#7 / P7B
:PKCS#7 或 P7B 格式通常用于存儲證書鏈沉唠,它們以二進制格式存儲,并可以包含多個證書苛败。PKCS#7/P7B 格式的文件通常以 .p7b 或 .p7c 結(jié)尾满葛。
這些是常見的數(shù)字證書后綴格式,每種格式都有其特定的用途和兼容性罢屈。在使用數(shù)字證書時嘀韧,需要根據(jù)具體情況選擇合適的格式。
1.4 目前nginx支持哪種證書格式缠捌?
目前nginx支持的證書格式是.crt或者.pem格式的證書(也就是ssl_certificate后面配置的證書格式)锄贷,如果是其他類型證書需要手動轉(zhuǎn)換成.crt或者.pem格式。
1.5 nginx修改配置文件目前方式也會有所不同
-
方式1(最常見的方式)
鄙币,ssl_certificate服務(wù)端配置證書肃叶,ssl_certificate_key配置私鑰(這里差別在證書,無論證書中是否包含私鑰信息都可以這么配置生效)
server_name 10.161.29.209;
ssl_certificate CA/server.crt;
ssl_certificate_key CA/server_pkcs8.key;
-
方式2十嘿,ssl_certificate和ssl_certificate_key統(tǒng)一指向服務(wù)端配置證書
因惭,詳情請看nginx官網(wǎng)文檔和圖片(這里就要求:證書必須包含私鑰,否則重啟nginx會失敗绩衷,會報錯找不到或加載不到私鑰信息)
nginx官網(wǎng)文檔 → https://nginx.org/en/docs/http/configuring_https_servers.html
1.6 介紹下不通格式的證書哪些可以包含私鑰蹦魔,哪些不能?
網(wǎng)上搜到的圖片長這樣
接下來說下我自己測試后的理解咳燕,可能會和上面不同勿决,也可能相同,我沒做過對比
-
.crt格式
:包含公鑰招盲、證書信息低缩;可包含或者不包含私鑰 -
.pem格式
:包含公鑰、證書信息;可包含或者不包含私鑰 -
.der格式
:包含公鑰咆繁、證書信息讳推;默認不包含私鑰 -
.p12或者pfx格式
:包含公鑰、證書信息玩般、可包含或者不包含私鑰 其他格式尚未驗證
1.7 創(chuàng)建私鑰银觅、證書請求、證書的命令
首先需要安裝openSSL坏为,使用它可以快速創(chuàng)建私鑰究驴、證書請求、證書匀伏。
舉例創(chuàng)建自簽名證書流程:
1. 要創(chuàng)建自簽名證書
洒忧,你可以使用 OpenSSL 工具。以下是使用 OpenSSL 創(chuàng)建自簽名證書的基本步驟:
2. 安裝 OpenSSL
:首先帘撰,確保你的系統(tǒng)上已經(jīng)安裝了 OpenSSL 工具跑慕。你可以從 OpenSSL 官方網(wǎng)站或使用包管理器進行安裝。
openssl genpkey -algorithm RSA -out private.key
這將生成一個名為 private.key 的私鑰文件摧找。
3. 生成證書請求
:接下來,使用私鑰生成一個證書請求 (CSR) 文件牢硅,其中包含了公鑰和其他相關(guān)信息蹬耘。執(zhí)行以下命令生成 CSR 文件:
openssl req -new -key private.key -out csr.csr
在此過程中,你將被要求提供一些相關(guān)信息减余,如國家/地區(qū)综苔、組織名稱、通用名稱 (域名) 等位岔。請根據(jù)實際情況填寫這些信息如筛。
4. 生成自簽名證書
:使用以下命令生成自簽名證書:
openssl x509 -req -in csr.csr -signkey private.key -out certificate.crt
這將使用私鑰和證書請求生成一個自簽名證書文件,名為 certificate.crt抒抬。
5. 使用證書
:現(xiàn)在你已經(jīng)生成了自簽名證書 certificate.crt杨刨,可以將其用于服務(wù)器或應(yīng)用程序的 SSL/TLS 配置中。具體步驟取決于你使用的服務(wù)器軟件或編程語言擦剑。
請注意妖胀,自簽名證書不會被公共信任的根證書頒發(fā)機構(gòu)所信任,因此在使用自簽名證書時惠勒,瀏覽器或客戶端可能會顯示警告赚抡。自簽名證書更適合用于測試環(huán)境或內(nèi)部使用,而不是用于公共生產(chǎn)環(huán)境纠屋。
另外涂臣,請確保妥善保管私鑰文件和證書文件,以防止未經(jīng)授權(quán)的訪問和潛在的安全風險售担。
1.8 如何區(qū)分證書中是否包含私鑰信息
舉例說明:
我拿兩個證書文件赁遗,用記事本打開看效果署辉,如圖1中“-----BEGIN CERTIFICATE-----”這個開頭的就是公鑰信息
,如圖2中“-----BEGIN PRIVATE KEY-----”包含的就是私鑰信息
吼和。最簡單的鑒別方式就是用記事本打開看區(qū)別涨薪,當然有的格式是二進制編碼打開亂碼,這時候就需要去服務(wù)器指定路徑下使用命令去打開證書文件才能看到具體內(nèi)容區(qū)別炫乓。
<center><font color='red'>如圖1</font></center>
<center><font color='red'>如圖2</font></center>
1.9 多文件內(nèi)容合并文件命令操作在windows和linux下不同
- 在 Windows 上使用
type
命令:
type certificate.pem server_pkcs8.key > certificate_with_key.pem
這個命令會將 certificate.pem 文件和 server_pkcs8.key 文件的內(nèi)容連接到一個新文件 certificate_with_key.pem 中刚夺。
- 在類 Unix 系統(tǒng)(如 Linux 或 macOS)上使用
cat
命令:
cat certificate.pem server_pkcs8.key > certificate_with_key.pem
這個命令也會將 certificate.pem 文件和 server_pkcs8.key 文件的內(nèi)容連接到一個新文件 certificate_with_key.pem 中。
請確保在命令中替換 certificate.pem 和 server_pkcs8.key 為您實際的證書和私鑰文件路徑和名稱末捣。
這樣生成的 certificate_with_key.pem 文件將包含證書和私鑰信息侠姑。如果您還有其他問題或需要進一步的幫助,請告訴我箩做。
1.10 不同格式文件打開查看內(nèi)容方式
-
server_pkcs8.key私鑰
莽红,可直接記事本打開
image.png -
server.csr證書請求文件
,可直接記事本打開
image.png -
certificate.crt格式證書
邦邦,可直接記事本打開
image.png -
certificate.pem格式證書
安吁,可直接記事本打開
image.png certificate.der格式證書
,無法直接記事本打開會亂碼燃辖,需要在服務(wù)器使用命令打開
命令:
openssl x509 -inform DER -in certificate.der -text
-
certificate.p12格式證書
鬼店,無法直接記事本打開會亂碼,需要在服務(wù)器使用命令打開
命令:
openssl pkcs12 -info -in certificate.p12
-
certificate.pfx格式證書跟.p12同理
黔龟,無法直接記事本打開會亂碼妇智,需要在服務(wù)器使用命令打開
命令:
openssl pkcs12 -info -in certificate.pfx
二、具體實施操作
2.1 針對方式一中nginx分別指定私鑰和證書地址
創(chuàng)建不帶私鑰信息的.crt格式的證書名
氏身,命令:
openssl x509 -req -in server.csr -signkey server_pkcs8.key -out certificate.crt -days 7200
創(chuàng)建不帶私鑰信息的.pem格式的證書名
巍棱,命令:
openssl x509 -req -in server.csr -signkey server_pkcs8.key -out certificate.pem -days 7200 -outform PEM
創(chuàng)建不帶私鑰信息的.der格式的證書名
,命令:
openssl x509 -req -in server.csr -signkey server_pkcs8.key -out certificate.der -days 7200 -outform DER
2.2 針對方式二中nginx私鑰和證書統(tǒng)一指向證書地址
創(chuàng)建帶私鑰信息的.crt格式的證書名
蛋欣,(思路:將原crt不帶私鑰的證書文件和私鑰合并為一個新文件航徙,其中“certificate.crt”代表你原crt文件,“server_pkcs8.key”代表私鑰豁状,“certificate_with_key.crt”代表合并后的文件)捉偏,命令:
openssl x509 -req -in server.csr -signkey server_pkcs8.key -out certificate.crt -days 7200
cat certificate.crt server_pkcs8.key > certificate_with_key.crt
創(chuàng)建帶私鑰信息的.pem格式的證書名
(思路:crt格式、pem格式泻红、der格式都采用合并文件方式生成新文件)夭禽,命令:
openssl x509 -req -in server.csr -signkey server_pkcs8.key -out certificate.pem -days 7200 -outform PEM
cat certificate.pem server_pkcs8.key > certificate_with_key.pem
創(chuàng)建帶私鑰信息的.der格式的證書名
(思路:crt格式、pem格式谊路、der格式都采用合并文件方式生成新文件)讹躯,命令:
openssl x509 -req -in server.csr -signkey server_pkcs8.key -out certificate.der -days 7200 -outform DER
cat certificate.der server_pkcs8.key > certificate_with_key.pem
創(chuàng)建帶私鑰信息的.p12格式的證書名
(思路:它跟crt\pem\der格式不同,他采用生成.p12文件后,再轉(zhuǎn)換成pem或者crt格式)潮梯,命令:
openssl pkcs12 -export -out certificate.p12 -inkey server_pkcs8.key -in certificate.crt
openssl pkcs12 -in certificate.p12 -out p12TransformPemPri.pem -nodes
或者
openssl pkcs12 -in certificate.p12 -out p12TransformPemPri.crt -nodes
創(chuàng)建帶私鑰信息的.pfx格式的證書名
(思路:跟創(chuàng)建.p12相同)骗灶,命令:
openssl pkcs12 -export -out certificate.pfx -inkey server_pkcs8.key -in certificate.crt
openssl pkcs12 -in certificate.pfx -out pfxTransformPem.pem -nodes
或者
openssl pkcs12 -in certificate.pfx -out pfxTransformPem.crt -nodes
2.3 命令中部分參數(shù)介紹
-
-req
:生成證書請求(CSR)。 -
-in
:指定輸入文件或數(shù)據(jù)秉馏。 -
-signkey
:使用指定的私鑰進行簽名耙旦。 -
-out
:指定輸出文件。 -
-outform
:指定輸出格式萝究。 -
-inform
:指定輸入格式免都。 -
pkcs12 -export
:將證書和私鑰打包成 PKCS #12 格式。 -
-nokeys
:在輸出中不包括私鑰帆竹。 -
-CAcreateserial
:在生成自簽名證書時創(chuàng)建一個序列號文件绕娘。 -
-text
:顯示證書或 CSR 文件的文本信息。
三栽连、重啟nginx驗證生效
進入nginx目錄
cd /home/ems/3rdparty/nginx/
驗證nginx.conf 修改是否正確
sbin/nginx -t
如果出現(xiàn) 以下內(nèi)容险领,nginx.conf即是修改正確
nginx: the configuration file /home/ems/3rdparty/nginx/nginx.conf syntax is ok
nginx: configuration file /home/ems/3rdparty/nginx/nginx.conf test is successful
重啟nginx ,等候30s 訪問新加的域名即可秒紧。
sbin/nginx -s reload