如果您剛剛獲得了一個有效的 SSL 證書,並且很難找到對應的私鑰,本文可以幫助您找到該證書的唯一私鑰。
什麼是私鑰?
首先,讓我們簡單了解一下基本概念。全球公鑰基礎設施的設計,正是依賴於 SSL/TLS 的安全協商,意味著總是有一對獨特的密鑰 -
公鑰與私鑰
公鑰嵌入在 SSL 證書中,而私鑰則存儲在伺服器上並保持私密。當網站訪問者填寫帶有個人信息的表單並提交到伺服器時,這些信息會用公鑰加密,以防止被竊聽。在伺服器上,這些信息由私鑰解密並傳遞以進行進一步處理。為了確保沒有人能夠解密傳輸的消息,我們必須使用一對獨特且無法仿製的密鑰。因此,簡而言之,只有一個密鑰是沒用的。
如何生成私鑰?
私鑰是在CSR(證書簽名請求)生成的同時生成的,CSR 包含域名、公鑰和附加聯繫信息。CSR 必須在證書激活後立即發送給證書授權機構以進行驗證和簽署。私鑰必須保持私密,理想情況下應存放在將安裝證書的同一伺服器上。
我可以為我的 SSL 證書生成一個新的私鑰嗎?
由於公鑰必須由受信任的證書授權機構簽名,並附帶額外信息(即域名和管理聯繫信息),以使其對與伺服器的通信變得適用和合法,因此如果我們能隨便為已經驗證的公鑰生成一個新的私鑰,這樣就沒有多大意義。另一方面,我們必須確保沒有人能根據公鑰創建匹配的私鑰。因此,現代加密系統使這個任務幾乎不可能。
私鑰的樣子是什麼?
私鑰是一段編碼的數據,通常是幾十行隨機樣式的符號,夾在類似於這些標題之間:-----BEGIN RSA PRIVATE KEY----- 和 -----END RSA PRIVATE KEY-----。

不過,在大多數情況下,當生成 CSR 時,這段代碼不會顯示出來。它通常是在背景中創建並靜默保存到伺服器的文件系統中。顯然,在SSL 證書安裝過程中,私鑰應自動提取到證書中。然而,有些系統並未這樣運作,或者有時我們需要在另一個伺服器上安裝證書。這些都是我們確實需要知道私鑰確切位置的情況。
如何檢索丟失的私鑰
這取決於特定的伺服器操作系統以及在生成 CSR 時是否使用了 CLI(命令行界面)或特定類型的網絡主機控制面板。現在進入重點部分。
下面您可以找到提示、示例和建議,以便幫助您獲得缺失的私鑰,並避免重新發放證書(即從頭開始重複激活和驗證過程)。
如何在不同伺服器平台上檢索私鑰:
- Linux 操作系統(Apache、Nginx、Lighttpd、Heroku)
- Windows 操作系統(IIS、Exchange、小型商業伺服器)
- Mac OS X
- Tomcat(使用 keytool)
- cPanel
- WHM
- Plesk
- Synology NAS DSM
- Webmin
- VestaCP
- DirectAdmin
- Webuzo
Linux 操作系統(Apache、Nginx、Lighttpd、Heroku)
傳統上,Linux 系統(如 Ubuntu、Debian、CentOS、RedHat 等)上的私鑰 是使用 openssl 生成的密鑰,並用加密工具包保存到 .key 或 .pem 擴展名的文件中。然而,由於在 Linux 系統上簡單文本文件並不強制要求特定擴展名,因此私鑰代碼可以放入幾乎任何名稱的文件中。
如果您記得密鑰文件的完整或部分名稱,可以嘗試通過運行以下 'find' 命令來獲取其位置:
find [search_start_folder] -type f -iname 'private.key'
- [search_start_folder] 參數指定開始搜索的目錄,以及其內部所有目錄,例如,從 'root' 開始搜索,必須指定 / 符號;
- 若要通過部分文件名稱進行搜索,應用帶有星號 (*) 的假設文件名稱,例如,'*.key' 值可定位文件名以 '.key' 結尾的所有文件。
提示: 很多時候,密鑰文件的名稱與證書發放的域名相似,例如 'zbtest.info.key'、'zbtest_info.key'、'zbtest-info.key' 等。
另一種獲得私鑰文件位置的方法是通過特定模式在文件內搜索:
grep -r --exclude-dir=log --exclude-dir=ssh --exclude=*history -I -l -e '-----BEGIN PRIVATE*' -e '-----BEGIN RSA*' [search_start_folder] 2> /dev/null
這條單行命令將打印出包含匹配表達式(------BEGIN 標頭)的文件的絕對路徑,例如 '/etc/ssl/private.key'。
Windows 操作系統(IIS、Exchange、小型商業伺服器)
Windows 系統不允許以純文本形式檢索私鑰。當通過 MMC 或 IIS 導入 SSL 證書時,匹配的私鑰會自動綁定到證書上,當然,如果該證書被導入到生成密鑰的同一實例中。但是,如果我們需要獲取私鑰,例如為在另一個伺服器上安裝證書,則可以選擇將密鑰導出為受密碼保護的文件(PFX 或 PKCS12 格式)。為此,您需要以下方式打開 MMC 證書管理單元:
Win+R > mmc.exe > 確定 > 文件 > 添加/刪除管理單元 > 證書 > 添加 > 計算機賬戶 > 下一步 > 本地計算機 > 完成 > 確定
然後導航至證書登記請求 > 證書(如果證書請求尚未完成)或個人 > 證書(如果證書請求已完成)文件夾,右鍵單擊證書條目並單擊所有任務 > 導出以打開導出向導。詳細的導出過程可以在這裡找到。

最終,您將獲得包含密鑰的 .pfx 文件。要獲取純文本格式的密鑰,可以使用工具(PKCS#12 轉 PEM 選項)將 .pfx 轉換成 PEM 編碼的文件。
Mac OS X
服務器應用中的默認 'Keychain' 工具不允許通過圖形用戶界面訪問生成的私鑰。不過,使用終端的命令行工具,可以導航至 '/etc/certificates' 文件夾並打開密鑰文件,該文件應叫做類似 '.key.pem' 的名稱。
Tomcat(使用 keytool)
除非在 APR 風格中配置 Tomcat 的 SSL 連接器,否則私鑰通常存儲在受密碼保護的 Java 密鑰庫文件(.jks 或 .keystore)中,該密鑰庫是在 CSR 之前創建的。要以 PEM 格式提取密鑰,必須首先將密鑰庫轉換為 .pfx/.p12(PKCS#12)文件。可以使用 'keytool' 工具通過以下命令完成此操作:
keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype PKCS12 -srcalias
'keystore.jks' 應替換為包含所需密鑰的密鑰庫的名稱;'keystore.p12' 應替換為密鑰庫將被轉換為的 .pfx/.p12 文件名稱;
當 .pfx/.p12 文件創建後,可以使用這個工具(PKCS#12 轉 PEM 選項)或使用 OpenSSL 將其轉換為 PEM 格式的文件。OpenSSL 命令將是:
openssl pkcs12 -in keystore.p12 -nocerts -nodes -out private.key
- 'private.key' 指私鑰文本將保存到的文件名稱。
cPanel
在 cPanel 中有兩種方法可以獲取私鑰:
- 使用 SSL/TLS 管理器
在 cPanel 主頁上,單擊 'SSL/TLS Manager' 然後點擊 'Private keys' 按鈕。在新屏幕上,您應該看到該特定 cPanel 帳戶下創建的私鑰列表。單擊 'View & Edit' 按鈕將打開顯示以編碼和解碼形式呈現的密鑰的屏幕: - 使用文件管理器
從 cPanel 主屏幕單擊文件管理器按鈕,並打開如下圖所示的窗口。接下來,您需要找到 'ssl' 文件夾,然後單擊其中的 'key' 目錄。私鑰將顯示在右側導航面板中。然後可以下載或以純文本形式打開所需的密鑰文件:


WHM
在 WHM 中,私鑰與相應的 CSR 和證書一起存儲在 'SSL 存儲管理器' 中。要到達那裡,可以在主屏幕上單擊 'SSL/TLS',然後單擊 'SSL 存儲管理器'。要打開私鑰文本,您將需要單擊第一列中名為 'Key' 的放大鏡按鈕。

Plesk
導航到域 > domain.com > SSL/TLS 證書後,您應該會看到一個類似於下面截圖的頁面。帶有 'Private key part supplied' 訊息的鑰匙標誌表示系統中存在所需的密鑰。要以純文本形式打開它,您需要單擊條目的名稱,並向下滾動直到密鑰代碼出現在屏幕上。或者,您也可以單擊右側的綠色箭頭圖標,下載包含密鑰的 .pem 文件、CSR 和證書以及 CA 包,如果它們已經導入的話。該 .pem 文件可以用任何文本編輯器(如記事本)打開:

Synology NAS DSM
在 Synology DSM 中,私鑰會在 CSR 生成向導的最後一步以 archive.zip 文件下載。它保存在 .zip 壓縮檔內的 server.key 文件中,可以在本地計算機上用文本編輯器打開:

Webmin
Webmin 面板是基於命令行工具的圖形用戶界面,雖然它附帶了文件管理器(Filemin),可以用於瀏覽文件系統,以查找使用 OpenSSL 命令生成的密鑰文件,當 CSR 生成時。

在 Webmin 中找到私鑰的另一種方法是,打開 'Command shell' 選項,然後運行 'find' 或 'grep' 命令,這些命令可從本文檔的 'Linux 操作系統' 段落找到。
VestaCP
在 VestaCP 中,私鑰並不會在用戶界面中保存;在生成 CSR 的過程中必須將密鑰文本保存到本地文件中。
然而,仍然有機會通過 SSH 查找它。當 VestaCP 創建新的 CSR 時,私鑰以臨時文件的形式存儲在 '/tmp' 目錄中。該密鑰文件的絕對路徑可能看起來像 '/tmp/tmp.npAnkmWFcu/zbtest.info.key',例如。主要問題是,'/tmp' 目錄中的文件在每次伺服器重啟期間被永久刪除。
要獲取密鑰文件在實例中的位置,可以運行以下命令:
find /tmp -type f -iname 'domain.com.key'
- 'domain.com' 應替換為生成 CSR 的實際域名。
或者,同舊的 'grep' 命令也可以這樣使用:
grep -r -I -l -e '-----BEGIN PRIVATE*' -e '-----BEGIN RSA*' /tmp 2> /dev/null
DirectAdmin
在近期版本的 DirectAdmin 面板中,私鑰通常保存在系統中,並在 SSL 證書菜單的 'Paste a pre-generated certificate and key' 部分自動填充。
如果在證書安裝過程中,您打算在自動填充的私鑰文本下粘貼證書文本,但看到一個空白窗口,這可能意味著 CSR 代碼是在其他地方生成的,或者由於系統故障未將私鑰添加到該窗口。在後者情況下,可以通過 SSH 獲取密鑰。它通常保存在以下目錄中: /usr/local/directadmin/data/users/
Webuzo
Webuzo 主頁上的 'SSL' 部分位於主頁。單擊 'Private keys' 按鈕將顯示生成的密鑰列表。要查看密鑰文本,可以單擊列表右側的鉛筆按鈕:

總之,如果上述提到的任何提示都無法幫助您找到原始私鑰,則需要生成新的 CSR / 私鑰對,並重新發放證書,並確保這次私鑰的安全。