如何向 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 KEY
和 BEGIN RSA ENCRYPTED PRIVATE KEY
来包裹 Key 信息。
-----BEGIN RSA PRIVATE KEY---
...
-----END RSA PRIVATE KEY-----
PKCS#8 的格式如下,通常使用 BEGIN PRIVATE KEY
和 BEGIN 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
转换之后,我们就可以正常将证书进行上传!