本文介绍非对称加密中公钥与私钥的核心概念与工作机制,并指导如何使用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(证书颁发机构)提交申请。