我试图用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));
如何将EVP_PKEY*转换为.der格式的无符号字符*?或者获取.pem格式,然后进行转换?谢谢
发布于 2018-06-21 01:25:37
您可以使用函数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()使用SubjectPublicKeyInfo格式对EVP_PKEY结构进行解码和编码。除此之外,它们还遵循其他ASN.1函数的约定,比如d2i_X509()。
d2i_X509()手册页上有一条重要的说明:
int i2d_TYPE(TYPE *a, unsigned char **ppout);
i2d_TYPE()将A指向的结构编码为DER格式。如果ppout不为空,它将DER编码的数据写入*ppout处的缓冲区,并将其递增到刚刚写入的数据之后的指针。如果返回值为负,则发生错误,否则返回编码数据的长度。
因此,使用NULL第二个参数调用它一次,以发现缓冲区所需的长度。使用指向缓冲区的指针再次调用它以填充数据-但请注意,指针随后会递增(这是造成混淆的常见原因)。
https://stackoverflow.com/questions/50952528
复制相似问题