将 RSA Public .pem 文件转换为 pkcs8

Convert RSA Public .pem file to pkcs8

已创建 RSA public - 使用以下命令的私钥对 -

私钥-

openssl genrsa -out private-key.pem 512

Public 键

openssl rsa -in private-key.pem -pubout -out public-key.pem

使用以下命令将 private-key.pemPEM 转换为 pkcs8它工作得很好)-

openssl pkcs8 -topk8 -inform PEM -outform DER -in private-key.pem -nocrypt > my_key

但是 not 可以使用如下命令将 public-key.pem 从 PEM 转换为 pkcs8 -

openssl pkcs8 -topk8 -inform PEM -outform DER -in public-key.pem -nocrypt > my_key.pub

出现以下错误-

openssl pkcs8 -topk8 -inform PEM -outform DER -in public-key.pem -nocrypt > my_key.pub
unable to load key
4525680300:error:09FFF06C:PEM routines:CRYPTO_internal:no start line:/AppleInternal/Library/BuildRoots/66382bca-8bca-11ec-aade-6613bcf0e2ee/Library/Caches/com.apple.xbs/Sources/libressl/libressl-2.8/crypto/pem/pem_lib.c:684:Expecting: ANY PRIVATE KEY

“无法加载密钥”“需要:任何私钥”

Like to use it for RSA based JWT process like this

PKCS8 不是 public 密钥的标准。 这就是为什么 Java,包括您 link 的代码,使用 PKCS8EncodedKeySpec 用于 private 密钥,但 X509EncodedKeySpec -- 不是 PKCS8 -- 用于 public 密钥。

要创建 X.509 (SPKI) DER publickey Java 想要,使用

openssl rsa -pubin -in public.pem -outform der -out public.der

...或结合提取步骤

openssl rsa -in private.pem -pubout -outform der -out public.der

另外你应该知道 512 位 RSA 是可怕的、可怜的、脆弱的并且是易碎的25 年前;我最近没有检查过,但现在它可能会在几分钟内被打破。但这与编程或开发无关,因此是题外话,除非你想将它用于 JWT/JWS/JWE 那些使用 JWA RFC7518 和 RSA 签名(3.3 和 3.5)和密钥的算法transport (4.2) 该文档要求密钥为“2048 位或更大”。


添加评论: genrsa 命令的最后一个参数是密钥的大小(以位为单位);您的 genrsa ... 512 生成了 512。您可以通过例如openssl rsa -in private.pem -text -noout(您实际上并不需要 -noout,这只会减少混乱)。替代例如2048 将生成一个 2048 位密钥,这是当今最常见的标准(也是最常见的实际值),尽管有些人仍然使用稍小的值,有些人更喜欢使用更大的值来防止 faster-than-expected 改进传统技术(但不是量子技术,如果它在实际规模上实现,预计将打破 所有 RSA 的实际规模,并需要更改为完全不同的算法)。

我猜您确实查看了 文件 大小(始终以字节显示)。这与 key 大小(以位为单位)有很大不同,但永远不会是 256,而且很少有 512(即碰巧等于 bit-size模数)。

traditional/symmetric 密码的第一个(基本)密钥主要是 'just bits'(尽管 DES 通过使用奇偶校验混淆了这一点),但是 publickey/asymmetric 算法(如 RSA)的密钥更复杂。 RSA 密钥对(OpenSSL 的私钥实际上是一个密钥对,这就是为什么您可以从中提取公钥)以模数 n 开头,但也包含两个指数(e 和 d)、两个质因数(p 和 q),以及几个 'CRT' 组件(dp、dq 和 qinv)。有关详细信息,请参阅 wikipedia or PKCS1 republished as RFC8017 et pred,尤其是 3.2 和 A.1.2。 RSA 密钥的大小通常通过其模数(仅以位为单位)来衡量,但完整的密钥对要大几倍,尽管 publickey 只是略微大于模数。

其次,OpenSSL 用来存储密钥(密钥对或 publickey-only)的 文件 包含的不仅仅是实际密钥;它们包含元数据,其大小因格式而异,并且在某些情况下是超级编码 and/or 加密的,这增加了大小(尽管您的示例不使用加密),并且文件以 字节 。首先,OpenSSL 代表所有使用 Abstract Syntax Notation One aka ASN.1 的非对称密钥,特别是 Distinguished Encoding Rules aka DER(linked);对于 RSA 密钥,这些是上面 RFC8017 A.1.2 和 A.1.1 linked 中的 ASN.1 结构。 ASN.1 DER 是一种 variable-length 编码,512 位 RSA 密钥的 RSAPrivateKey 结构通常在 317-321 字节的范围内变化,尽管它可以(很少)更少(但绝不会更多) .

那么对于私钥(密钥对),OpenSSL 有两种主要格式,还有几种变体或子格式。对于DER中的'traditional'格式,简单的写PKSC1的RSAPrivateKey结构;在 PEM 中,如果未加密,它首先将 PKCS1 结构转换为带有换行符的 base64,然后添加 header 和结尾行,总共通常为 487-498 字节。 PEM 格式可以加密,这使得它更长。对于 algorithm-generic PKCS8 形式,如果在 DER 中未加密,它会有效地向 PKCS1 结构添加一个 header,在这种情况下为 26 字节,通常给出 343-347 字节,转换为 PEM 为 520-532 字节;在 DER 或 PEM 中支持的 PKCS8 加密更大。 None 其中有 256 个。

OTOH for publickey OpenSSL(至少在大多数命令行中)仅使用一种格式和两种变体; X.509 as subsetted by PKIX RFC5280 4.1 定义的 SubjectPublicKeyInfo 结构中来自 PKCS1(上面 linked)的 RSAPublicKey 结构。对于 512 位 RSA,结果是 DER 中的 94 字节或 PEM 中的 182-186 字节(均未加密)。再次不是 256.