PEM_write_PrivateKey的手册页指出它使用传统私钥格式写私钥。
这与PKCS8和PKCS1有什么关系?
答案 0 :(得分:2)
您所引用的文档似乎不再准确(不再)。如今,PEM_write_PrivateKey()
与PEM_write_PKCS8PrivateKey()
在RSA,DSA和EC密钥的OpenSSL实现中起着相同的作用。
与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级别使用较弱的加密模式进行的。有关RSA情况下与PKCS#1进行比较的详细说明,请参见SO问题Password callback for reading public key with OpenSSL API的答案。
问题中的“传统”密钥格式是指非PKCS#8密钥格式,这在RSA和EC密钥以及OpenSSL特定于DSA的情况下是标准的,但并不统一。对于RSA密钥,这恰好是通常称为PKCS#1格式的格式。有关更多信息,另请参见对SO问题PKCS#1 and PKCS#8 format for RSA private key的回答。
如果要以“传统”格式编写,则必须显式调用关联的函数,例如PEM_write_RSAPrivateKey()。在这种情况下,文档确实似乎是准确的(语法错误:-)除外):
RSAPrivateKey函数使用RSA处理RSA私钥 结构体。写入例程使用传统格式。