如果您刚刚获得了一个有效的 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 / 私钥对,并重新发放证书,并确保这次私钥的安全。