PEM_write_PrivateKey的手册页声明它使用传统的私钥格式写入私钥。
这与PKCS8和PKCS1有什么关系?
发布于 2018-12-03 22:32:43
您所指的文档似乎不再准确(不再)。目前,PEM_write_PrivateKey()对RSA、DSA和EC密钥的OpenSSL实现做的事情与PEM_write_PKCS8PrivateKey()相同。
与OpenSSL的情况一样,源代码是获取信息的更可靠的方法。看看PEM_write_bio_PrivateKey(),它应该根据文档给出“传统”格式,我们看到:
int PEM_write_bio_PrivateKey(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
unsigned char *kstr, int klen,
pem_password_cb *cb, void *u)
{
if (x->ameth == NULL || x->ameth->priv_encode != NULL)
return PEM_write_bio_PKCS8PrivateKey(bp, x, enc,
(char *)kstr, klen, cb, u);
return PEM_write_bio_PrivateKey_traditional(bp, x, enc, kstr, klen, cb, u);
}实际上,这里提到了一个传统的私钥写入函数,但前提是priv_encode方法不是针对该特定密钥类型实现的。但它实际上是为标准密钥类型实现的。对于1.0.2g (您根据下面的注释使用的版本),您可以在这里看到相关的函数:rsa_priv_encode()、dsa_priv_encode()和eckey_priv_encode()。PKCS#8是编写私钥时的标准格式。
PKCS#8能够捕获多种类型的密钥。其格式包括以加密形式存储私钥的选项。这与使用较弱的加密模式在PEM级别进行密钥加密的旧格式不同。请参阅对SO问题用OpenSSL API读取公钥的密码回调的回答,以获得更详细的关于RSA的解释,并将其与PKCS#1进行比较。
问题中的“传统”密钥格式指的是非PKCS#8密钥格式,这是RSA和EC密钥的标准格式,以及针对DSA的OpenSSL专用密钥格式,但并不统一。对于RSA密钥,这恰好是一种格式,通常被称为PKCS#1格式。有关更多信息,请参见对SO问题RSA私钥的PKCS#1和PKCS#8格式的回答。
如果您想要以“传统”格式编写,则必须显式调用相关函数,例如RSAPrivateKey()。在这种情况下,文档看起来确实是准确的(除了语法错误:- ):
RSAPrivateKey函数使用RSA结构处理RSA私钥。写入例程使用传统格式。
https://stackoverflow.com/questions/53601150
复制相似问题