Преобразовать сертификат в байтовый массив - PullRequest
1 голос
/ 29 января 2011

Как преобразовать сертификат (формат PEM / DER) в байтовый массив?

У меня нет файловой системы на моем устройстве, и я хочу использовать сертификат клиента на нем.Поэтому я хочу скопировать этот сертификат SSL в буфер (без знака).На моем компьютере с Windows есть файл сертификата.

Как правильно преобразовать сертификат в массив?Простая копия персонажа будет работать?

Vishal N

Ответы [ 2 ]

2 голосов
/ 02 марта 2017

отметьте этот код, объяснения добавляются как комментарии,

1 Загрузить файл в структуру BIO

2 Преобразуйте его в x509, используя PEM_read_bio_X509_AUX

3 преобразовать x509 в unsigned char *, используя i2d_X509

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_X509 , PEM_read_bio_X509_AUX для получения более подробной информации.

Этот буфер может использоваться для создания PCCERT_CONTEXT структуры.

0 голосов
/ 31 января 2011

Когда вы используете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...