将证书转换为字节数组

时间:2011-01-29 10:52:49

标签: c ssl-certificate

如何将证书(PEM / DER格式)转换为字节数组?

我的设备上没有文件系统,想要在其上使用客户端证书。所以我想将这个SSL证书复制到缓冲区(unsigned char)。我的Windows机器上有证书文件。

将证书转换为数组的正确方法是什么?简单的字符复制会起作用吗?

Vishal N

2 个答案:

答案 0 :(得分:2)

检查此代码,解释被添加为注释,

  

1将文件加载到BIO结构

     

2使用PEM_read_bio_X509_AUX

将其转换为x509      

3使用i2d_X509

将x509转换为unsigned char *
int main()
{    
    X509 *x509;    
    BIO *certBio = BIO_new(BIO_s_file());   
    char * path = "E:\\share\\TempCert.pem"; /* directory path where certificate exists*/
    int len;
    unsigned char *buf;   

    buf = NULL;
    BIO_read_filename(certBio, path);
    x509 = PEM_read_bio_X509_AUX(certBio, NULL, 0, NULL);      /*loading the certificate to x509 structure*/
    len = i2d_X509(x509, &buf);     /*loading the certificate to unsigned char buffer*/

    /* You can use this buf as BYTE array since BYTE is typedef of unsigned char and len will contain the length(size) of the certificate */
    BIO_free_all(certBio);  
    return 0;
} 

检查i2d_X509PEM_read_bio_X509_AUX函数以获取更多详细信息。

此缓冲区可用于创建PCCERT_CONTEXT结构。

答案 1 :(得分:0)

使用gcc + gnu-binutils + openssl时,可以使用ld将文件文字包含到程序中。然后使用d2i_X509将文字解析为X509结构。

首先运行ld -r -b binary -o cert.crt.o cert.crt(cert.crt必须是DER形式,我不知道.crt是否是DER的正确扩展名。)

example.c

#include <openssl/x509.h>
#include <stdio.h>

extern unsigned char _binary_cert_crt_start[];
extern unsigned char _binary_cert_crt_end[];

int main()
{
   X509 *cert;
   const unsigned char *buf = _binary_cert_crt_start;
   unsigned const char** inp = &buf;
   cert = d2i_X509(NULL, inp, _binary_cert_crt_end-_binary_cert_crt_start);
   printf("%p\n", cert);
   return !cert;
}

然后使用gcc -o ct example.c cert.crt.o -lcrypto编译此程序。