本文介紹非對稱式加密中公開金鑰與私密金鑰的核心概念與工作機制,並指導如何使用OpenSSL及Keytool工具,建立符合阿里雲數位憑證服務需求的RSA私密金鑰,進而建立用於提交認證申請的認證簽章要求(CSR)檔案。
公開金鑰與私密金鑰定義
公開金鑰(Public Key)與私密金鑰(Private Key)是非對稱式加密演算法產生的一對密鑰,具有以下核心特性:
唯一對應關係
公開金鑰和私密金鑰成對產生,相互關聯且不可分割。
公開金鑰加密的資料僅能使用對應的私密金鑰解密。
私密金鑰簽名的資料僅能使用對應的公開金鑰驗證。
職責明確
公開金鑰:可公開分發,用於加密資料和驗證簽名。
私密金鑰:必須嚴格保密,用於解密資料和建立簽名。
在SSL/TLS中的應用
金鑰交換:安全傳輸對稱式加密的工作階段金鑰。
身分識別驗證:證明伺服器擁有與認證匹配的私密金鑰。
數位簽章:確保資料完整性和來源可信。
私密金鑰是整個安全體系的核心,一旦泄露將導致所有加密通訊失去安全保障。詳細的私密金鑰保護原理請參見數位憑證管理服務的私密金鑰保護原理是怎樣的?。
公開金鑰、私密金鑰及 SSL 憑證的協同工作原理
SSL/TLS安全通訊通過以下5個步驟建立:
認證出示
伺服器向用戶端發送SSL認證,認證包含:
伺服器的公開金鑰
網域名稱等身份資訊
CA的數位簽章
認證有效期間
認證驗證(用戶端驗證)
認證是否由受信任的CA簽發
說明此驗證過程依賴於用戶端作業系統或瀏覽器中預裝的受根信任認證庫。用戶端按照憑證鏈結順序(伺服器憑證→中間認證→根憑證)逐級驗證。當憑證鏈結能夠追溯到本地受信任的根憑證時,伺服器憑證被判定為可信。
認證是否在有效期間內
認證網域名稱是否與訪問網域名稱匹配
私密金鑰證明
伺服器通過以下方式之一證明擁有私密金鑰:
RSA金鑰交換:用私密金鑰解密用戶端發送的預主要金鑰。
DH/ECDH金鑰交換:用私密金鑰簽名ServerKeyExchange訊息。
TLS 1.3:用私密金鑰簽名CertificateVerify訊息。
工作階段金鑰協商
雙方基於交換的資訊產生相同的對稱式加密工作階段金鑰。
加密通訊
後續所有資料使用工作階段金鑰進行對稱式加密傳輸,確保高效且安全。
建立私密金鑰
阿里雲SSL認證服務需求私密金鑰滿足以下條件:
密碼編譯演算法:RSA
密鑰長度:不低於 2048位
根據實際情況,可選擇以下方式建立私密金鑰:
若需在阿里雲數位憑證管理服務購買認證,推薦在購買、建立或申請時選擇CSR產生方式為系統產生,此時無需自行建立私密金鑰及CSR檔案。
產生全新的私密金鑰
適用於大多數非 Java 環境(如 Nginx、Apache)或希望從零開始產生密鑰的情境。
擷取並安裝OpenSSL工具。
從OpenSSL官網擷取其安裝包。
說明請確保使用的 OpenSSL 為官方支援的最新穩定版本(如 1.1.1、3.x 等)。過時的版本可能包含已知的安全性漏洞。您可以通過在終端執行
openssl version命令來檢查目前的版本。產生私密金鑰檔案。
以下命令會建立一個名為
myprivate.pem、採用 RSA 演算法、指定密鑰長度的 PEM 格式私密金鑰檔案。請根據安全需求,選擇執行其中一條命令產生私密金鑰即可。# 產生 2048 位密鑰 openssl genrsa -out myprivate.pem 2048 # 產生更安全的 4096 位密鑰 openssl genrsa -out myprivate.pem 4096 # 產生帶密碼保護的私密金鑰(推薦用於高安全情境) openssl genrsa -aes256 -out myprivate.pem 4096
從現有Java密鑰庫(JKS)提取私密金鑰
適用於已使用 keytool 在 Java 密鑰庫(.jks 檔案)中儲存了金鑰組,並需要將其中的私密金鑰匯出為 PEM 格式(例如,用於配置 Nginx、Apache、CDN 等非 Java 環境)的情境。可通過以下任一方法完成匯出。
使用阿里雲認證格式轉換工具
阿里雲數位憑證管理服務提供了免費的線上工具,可一鍵將 JKS 密鑰庫轉換為 PEM 格式的私密金鑰和認證檔案。詳情可參考認證格式轉換。
使用 OpenSSL 命令列工具
將 JKS 格式轉換為 PKCS12 格式。
keytool無法直接將私密金鑰匯出為 PEM 格式,但可以先將其轉換為更通用的 PKCS12 (.p12) 格式。執行以下命令,系統將提示您輸入 JKS 源密鑰庫密碼和要設定的 PKCS12 目標密鑰庫密碼。# -srckeystore mydomain.jks : 指定源 Java 密鑰庫(JKS)檔案名稱。 # -destkeystore mydomain.p12 : 指定需產生的目標 PKCS12 檔案名稱。 # -srcalias mydomain : 指定 JKS 密鑰庫中私密金鑰條目的原始別名。請將 mydomain 替換為您的實際別名。 # -destalias mydomain : 指定在新 P12 檔案中為該密鑰條目設定的目標別名(通常保持與源別名一致)。 keytool -importkeystore -srckeystore mydomain.jks -destkeystore mydomain.p12 -deststoretype PKCS12 -srcalias mydomain -destalias mydomain從 PKCS12 檔案中提取 PEM 格式的私密金鑰。
若當前未安裝openssl,可從OpenSSL官網擷取其安裝包並安裝。
說明請確保使用的 OpenSSL 為官方支援的最新穩定版本(如 1.1.1、3.x 等)。過時的版本可能包含已知的安全性漏洞。您可以通過在終端執行
openssl version命令來檢查目前的版本。使用
openssl從前一步的.p12檔案中抽取出無加密的 PEM 格式私密金鑰。執行以下命令,系統會要求您輸入在上一步中設定的 PKCS12 檔案密碼。# myprivate.pem 檔案即為最終需要的私密金鑰檔案 # -nodes:表示不加密輸出的私密金鑰 # -nocerts:表示不輸出認證,只輸出私密金鑰 # 對於 OpenSSL 3.0 及以上版本,在遇到舊版本相容性問題時需添加 -legacy 參數 openssl pkcs12 -in mydomain.p12 -nodes -nocerts -out myprivate.pem # 若在 OpenSSL 3.x 出現“unsupported algorithm”或解密失敗,可嘗試添加 -legacy(注意:這將啟用已廢棄的密碼編譯演算法) openssl pkcs12 -in mydomain.p12 -nodes -nocerts -out myprivate.pem -legacy
以上兩種方式最終匯出的私密金鑰檔案均為PEM(Privacy-Enhanced Mail)編碼的文字格式設定。其內容通常由以下兩種格式之一表示:
PKCS#1格式
PKCS#1 格式是 RSA 密碼學標準的一部分,專門用於定義 RSA 公私密金鑰的文法。其私密金鑰檔案頭部標識為 -----BEGIN RSA PRIVATE KEY-----。
-----BEGIN RSA PRIVATE KEY-----
(Base64編碼的金鑰產製原料)
-----END RSA PRIVATE KEY-----PKCS#8格式
PKCS#8 是一個更通用的私密金鑰資訊文法標準,可以包含不同演算法(如 RSA, ECC 等)的私密金鑰。其私密金鑰檔案頭部標識為 -----BEGIN PRIVATE KEY-----。
-----BEGIN PRIVATE KEY-----
(Base64編碼的金鑰產製原料)
-----END PRIVATE KEY-----無論通過何種方式產生,私密金鑰檔案都必須得到最嚴格的保管。私密金鑰一旦泄露或丟失,任何使用對應公開金鑰加密的資料都將面臨被破解的風險,同時基於該金鑰組的數位憑證也將無法使用。
建立認證簽章要求(CSR)
在阿里雲數位憑證管理服務中購買、建立或申請認證時,如需使用自行建立的私密金鑰,請按以下步驟操作。
建立 CSR 檔案。
使用當前私密金鑰建立認證簽章要求(Certificate Signing Request, CSR)檔案。執行以下命令,將引導互動式地輸入所需資訊(國家、省份、城市、組織、通用名稱等),其產生的
mydomain.csr即為建立的CSR檔案。說明通用名稱 (Common Name) 必須準確填寫為當前需申請認證的網域名稱,例如
www.aliyun.com。# -key myprivate.pem: 指定您上一步產生的私密金鑰檔案 # -out mydomain.csr: 指定產生的CSR檔案名稱 openssl req -new -key myprivate.pem -out mydomain.csr使用前一步驟建立的CSR檔案。
在購買、建立或申請認證時,請選擇CSR產生方式為手動填寫,並粘貼當前CSR檔案的內容。具體操作可參見相關文檔:購買正式認證、建立SSL認證、向CA(憑證授權單位)提交申請。