首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用C++中的OpenSSL获取.der格式的公钥证书

用C++中的OpenSSL获取.der格式的公钥证书
EN

Stack Overflow用户
提问于 2018-06-21 00:01:16
回答 1查看 1.4K关注 0票数 1

我试图用C语言使用OpenSSL从证书中提取公钥,然后将其转换为.der格式,但我无法做到这一点。

目标是提取到提取到公钥以实现锁定,就像这里:https://curl.haxx.se/libcurl/c/CURLOPT_PINNEDPUBLICKEY.html (公钥提取)

我正在使用this tutorial中的代码。

代码语言:javascript
复制
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格式,然后进行转换?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-21 01:25:37

您可以使用函数i2d_PUBKEY()来实现此目的:

https://www.openssl.org/docs/man1.1.0/crypto/i2d_PUBKEY.html

代码语言:javascript
复制
 int i2d_PUBKEY(EVP_PKEY *a, unsigned char **pp);

请注意手册页上的以下重要声明:

d2i_PUBKEY()和i2d_PUBKEY()使用SubjectPublicKeyInfo格式对EVP_PKEY结构进行解码和编码。除此之外,它们还遵循其他ASN.1函数的约定,比如d2i_X509()。

d2i_X509()手册页上有一条重要的说明:

代码语言:javascript
复制
int i2d_TYPE(TYPE *a, unsigned char **ppout);

i2d_TYPE()将A指向的结构编码为DER格式。如果ppout不为空,它将DER编码的数据写入*ppout处的缓冲区,并将其递增到刚刚写入的数据之后的指针。如果返回值为负,则发生错误,否则返回编码数据的长度。

因此,使用NULL第二个参数调用它一次,以发现缓冲区所需的长度。使用指向缓冲区的指针再次调用它以填充数据-但请注意,指针随后会递增(这是造成混淆的常见原因)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50952528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档