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

时间:2018-06-20 16:01:16

标签: openssl ssl-certificate

我正在尝试使用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格式获取它然后进行转换? 谢谢

1 个答案:

答案 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参数调用一次,以发现所需的缓冲区长度。再次使用指向缓冲区的指针来调用它以填充数据-但请注意,此后指针将增加(常见的混淆源)。