如何向 Key Vault 中上传 PKCS#1 编码格式的证书

问题描述

Azure Key Vault 支持上传 PEM 格式的证书,但是要求 PEM 证书的格式必须符合 PKCS#8 规范,但我们在使用 openssl 等工具生成证书时,默认会生成 PKCS#1 编码的 key,如果直接将 PKCS#1 编码的 key 导入 Key Vault 时,会返回错误:PEM is unexpected format,导致无法正常导入。

问题分析

将 KCS#1 的证书转换为 PKCS#8 格式,然后在上传至 Azure Key Vault,我们可以借助 openssl 工具或者使用代码进行转换。

首先,介绍下 PKCS#8 和 PKCS#1 的区别,PKCS#1 是 RSA 加密标准,PKCS#1 定义了 RSA 公钥函数的基本格式标准,特别是数字签名。而 PKCS#8 是更为通用的非对称加密私钥语法标准。两者的格式区别 :

PKCS#1 的格式如下,通常使用 BEGIN RSA PRIVATE KEYBEGIN RSA ENCRYPTED PRIVATE KEY 来包裹 Key 信息。

-----BEGIN RSA PRIVATE KEY---
       ...
-----END RSA PRIVATE KEY-----

PKCS#8 的格式如下,通常使用 BEGIN PRIVATE KEYBEGIN ENCRYPTED PRIVATE KEY 来包裹 Key 信息。

-----BEGIN PRIVATE KEY---
    ...
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE---
    ...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE---
    ...
-----END CERTIFICATE-----

如果 Private Key 使用加密格式,那么 Private Key 的格式如下:

-----BEGIN ENCRYPTED PRIVATE KEY---
    ...
-----END ENCRYPTED PRIVATE KEY-----

解决方法

接下来,我们进行 PKCS#1 和 PKCS#8 的转换。

使用 openssl 工具将 PKCS#1 私钥转换为 PKCS#8 格式 :

执行命令如下,输入为 PKCS#1 Key,输出 PKCS#8 Key

openssl pkcs8 -topk8 -inform PEM -in pkcs1.key -outform pem -nocrypt -out pkcs8.pem

使用代码方式进行转换 :

我们可以使用代码解析 PKCS#1 格式的私钥,并将其按照 PCKS#8 的编码规范输出。示例代码,请参考以下代码片段文档 : RSAKeyUtils

转换之后,我们就可以正常将证书进行上传!

参考文档