我正在尝试使用C语言中的OpenSSL从证书中提取公钥,然后将其转换为.der格式,但是我无法做到这一点。
目标是提取以提取到公钥以实现固定,如下所示: https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html(公钥提取)
我正在使用this tutorial中的代码。
BIO *certbio = NULL;
X509 *cert = NULL;
ret = BIO_read_filename(certbio, cert_path);
cert = PEM_read_bio_X509(certbio, NULL, 0, NULL));
EVP_PKEY *pkey = X509_get_pubkey(cert));
如何将.der格式的EVP_PKEY *转换为未签名的char *? 还是以.pem格式获取它然后进行转换? 谢谢
答案 0 :(得分:2)
您可以为此使用功能i2d_PUBKEY():
https://www.openssl.org/docs/man1.1.0/crypto/i2d_PUBKEY.html
int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp);
请注意手册页上的这一重要声明:
d2i_PUBKEY()和i2d_PUBKEY()解码并编码EVP_PKEY 使用SubjectPublicKeyInfo格式的结构。他们否则跟随 其他ASN.1函数的约定,例如d2i_X509()。
d2i_X509()手册页上的这一重要说明:
int i2d_TYPE(TYPE *a, unsigned char **ppout);
i2d_TYPE()将a指向的结构编码为DER格式。 如果ppout不为NULL,它将DER编码的数据写入到 在* ppout处缓冲,并将其递增以指向数据之后 书面。如果返回值为负,则发生错误,否则 它返回编码数据的长度。
因此,使用第二个NULL参数调用一次,以发现所需的缓冲区长度。再次使用指向缓冲区的指针来调用它以填充数据-但请注意,此后指针将增加(常见的混淆源)。