Чтение файлов сертификата из памяти вместо файла с использованием OpenSSL - PullRequest
11 голосов
/ 28 сентября 2010

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

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

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


РЕДАКТИРОВАТЬ : Следующее было перенесено из комментариев к вопросу.

// 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
}

Ответы [ 3 ]

12 голосов
/ 28 сентября 2010

Следующий код сделал работу за меня:


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);
8 голосов
/ 27 августа 2015

Другие фрагменты будут загружать только один сертификат. Содержимое таких файлов, как 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
5 голосов
/ 28 сентября 2010
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 изменяет эти указатели.

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