Intereting Posts
Использовать сгенерированный заголовочный файл из Cython Как сделать паузу в C? Как я могу скомпилировать Programmer Dvorak? Как найти следующий кратный 10 из любого целого? что происходит, когда несколько процессов пытаются читать из одного и того же канала? вывод отрицательного целого числа в спецификатор формата% u Объявление функции стиля Старого стиля C вопрос: добавление битов в целые числа без знака и побитовые операции (C89) Попытка понять использование указателя функции Могут ли компиляторы давать предупреждения при использовании неинициализированных значений? MessageBox не будет работать при обработке события WM_DESTROY из DialogBox Как получить доступ к полям структуры времени Почему размер этих двух структур отличается? необъявленная ошибка идентификатора возникает, когда я уже объявил переменную Почему 0 (ноль) печатается без ведущего «0x» с форматом C printf «% # x»?

Чтение файлов сертификатов из памяти вместо файла с использованием OpenSSL

У меня есть сервер, который будет прослушивать HTTPS с помощью OpenSSL. Для этого я должен предоставить сертификат для использования. Тем не менее, текущая реализация использует имя файла, которое должно быть предоставлено API OpenSSL.

Я хочу, чтобы информация о сертификате считывалась из памяти, так что мне не нужно отправлять файл сертификата. Я попробовал Google, но у меня не было никаких вариантов.

Возможно ли это? Если да, то как я могу читать файлы сертификатов из памяти вместо файла с использованием OpenSSL?


EDIT : из комментариев к вопросу было перенесено следующее.

// CURRENT void start_server() { const char *fileName = "cert_and_key.pem"; set_server_ssl_file(fileName); } set_server_ssl_file(const char *fileName) { //initialize context SSL_CTX_use_certificate_file(CTX, pem, SSL_FILETYPE_PEM); SSL_CTX_use_PrivateKey_file(CTX, pem, SSL_FILETYPE_PEM); } //REQUIRED void start_server() { const char *cert = "--BEGIN CERTIFICATE--............"; const char *key = "--BEGIN RSA PRIVATE KEY--......."; set_server_ssl_options(cert, key); } set_server_ssl_options(const char *cert, const char *key) { //IMPLEMENTATION REQUIRED } 

    Следующий код выполнил эту работу для меня:

     SSL_CTX *CTX; X509 *cert = NULL; RSA *rsa = NULL; BIO *cbio, *kbio; const char *cert_buffer = ""; const char *key_buffer = ""; cbio = BIO_new_mem_buf((void*)cert_buffer, -1); cert = PEM_read_bio_X509(cbio, NULL, 0, NULL); assert(cert != NULL); SSL_CTX_use_certificate(CTX, cert); kbio = BIO_new_mem_buf((void*)key_buffer, -1); rsa = PEM_read_bio_RSAPrivateKey(kbio, NULL, 0, NULL); assert(rsa != NULL); SSL_CTX_use_RSAPrivateKey(CTX, rsa); 

    Другие fragmentы будут загружать только один сертификат. Для содержимого таких файлов, как http://curl.haxx.se/ca/cacert.pem, которые содержат множество разных сертификатов, нужен новый подход. Это адаптировано из openssl 1.0.1p (в основном openssl-1.0.1p \ crypto \ x509 \ by_file.c, char * buf содержит содержимое файла * .pem, ctx – это boost :: asio :: ssl :: context ), добавьте обработку ошибок самостоятельно:

     BIO *cbio = BIO_new_mem_buf((void*)buf, (int)length); X509_STORE *cts = SSL_CTX_get_cert_store(ctx.native_handle()); if(!cts || !cbio) return false; X509_INFO *itmp; int i, count = 0, type = X509_FILETYPE_PEM; STACK_OF(X509_INFO) *inf = PEM_X509_INFO_read_bio(cbio, NULL, NULL, NULL); if (!inf) { BIO_free(cbio);//cleanup return false; } //itterate over all entries from the pem file, add them to the x509_store one by one for (i = 0; i < sk_X509_INFO_num(inf); i++) { itmp = sk_X509_INFO_value(inf, i); if (itmp->x509) { X509_STORE_add_cert(cts, itmp->x509); count++; } if (itmp->crl) { X509_STORE_add_crl(cts, itmp->crl); count++; } } sk_X509_INFO_pop_free(inf, X509_INFO_free); //cleanup BIO_free(cbio);//cleanup 
     unsigned char *cert_data = (....); int cert_len = (....); X509 *cert = d2i_X509(NULL, &cert_data, cert_len); SSL_CTX_use_certificate(ctx, cert); unsigned char *pkey_data = /* ... */; int pkey_len = /* ... */; RSA *pkey = d2i_RSAPrivateKey(NULL, &pkey_data, pkey_len); SSL_CTX_use_RSAPrivateKey(ctx, pkey); 

    Не забывайте & перед cert_data и pkey_data – и обратите внимание, что OpenSSL изменяет эти указатели.