Учебник по использованию OpenSSL с pthreads - PullRequest
12 голосов
/ 13 октября 2010

Документы OpenSSL утверждают, что его можно безопасно использовать в многопоточных приложениях при условии, что установлены как минимум две функции обратного вызова: lock_function и threadid_func ....

Я написалпрограммы, которые используют OpenSSL API.Более того, я знаю, как использовать pthreads.Тем не менее, документы OpenSSL написаны в форме руководства, и я не вижу пошаговое руководство о том, что я должен делать при использовании OpenSSL в многопоточном приложении.

Isучебник по использованию OpenSSL с pthreads?(Я искал в Интернете, но не получил удовлетворительного результата.)

PS: Я работаю в Debian Lenny & Ubuntu Lucid / Maverick.

PS2: OpenSSL включает в себя пример, но он слишком сложен для начала.

Ответы [ 4 ]

10 голосов
/ 14 января 2011

Глава 10 книги Подробное руководство по сетевому программированию в Linux содержит раздел Потоковое программирование с OpenSSL (на страницах 255-259).В этом разделе подробно описано, как работают OpenSSL и библиотека pthreads.В частности, он рассказывает, как настроить функции обратного вызова как в статическом распределении (где число потоков известно a priori ), так и в динамическом распределении (где потоки создаются и уничтожаются на лету ).

Другим хорошим источником является Раздел 4.1 книги Сетевая безопасность с OpenSSL , озаглавленный Поддержка многопоточности .Он обеспечивает механизмы статического / динамического распределения в подразделах 4.1.1 и 4.1.2 соответственно.

Наконец, есть книга Unix-Netzwerkprogrammierung mit Threads, Sockets und SSL , которая на сегодняшний деньсамый полный по этому вопросу.К сожалению, английский перевод этой немецкой книги недоступен.

10 голосов
/ 09 ноября 2010

Не знаю об учебнике, но вот два примера на основе libcurl, которые могут помочь:

http://curl.haxx.se/libcurl/c/opensslthreadlock.html
http://curl.haxx.se/libcurl/c/threaded-ssl.html

8 голосов
/ 26 ноября 2013
  • openssl должен быть настроен с опцией потоков ./config thread -D_REENTRANT

  • Это вопрос копирования и вставки;tar-шар openssl включает в себя пример в файле crypto/threads/mttest.c

скопировать соответствующую платформу конкретной реализации и вызвать thread_setup для инициализации и thread_cleanup для завершения;

4 голосов
/ 19 декабря 2014

Основываясь на ответе Водина с использованием ссылок cURL, я всего лишь скопировал эти 4 функции

#include <openssl/crypto.h> //In addition to other ssl headers

...

/* we have this global to let the callback get easy access to it */ 
static pthread_mutex_t *lockarray;

static void lock_callback(int mode, int type, char *file, int line)
{
  (void)file;
  (void)line;
  if (mode & CRYPTO_LOCK) {
    pthread_mutex_lock(&(lockarray[type]));
  }
  else {
    pthread_mutex_unlock(&(lockarray[type]));
  }
}

static unsigned long thread_id(void)
{
  unsigned long ret;

  ret=(unsigned long)pthread_self();
  return(ret);
}

static void init_locks(void)
{
  int i;

  lockarray=(pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() *
                                        sizeof(pthread_mutex_t));
  for (i=0; i<CRYPTO_num_locks(); i++) {
    pthread_mutex_init(&(lockarray[i]),NULL);
  }

  CRYPTO_set_id_callback((unsigned long (*)())thread_id);
  CRYPTO_set_locking_callback((void (*)(int, int, const char*, int))lock_callback);
}

static void kill_locks(void)
{
  int i;

  CRYPTO_set_locking_callback(NULL);
  for (i=0; i<CRYPTO_num_locks(); i++)
    pthread_mutex_destroy(&(lockarray[i]));

  OPENSSL_free(lockarray);
}

Затем вызовите эти две функции следующим образом

int main(int argc, char **argv)
{
   //pthread initialization goes here

  init_locks();

  //pthread stuff here (create, join, etc)


  kill_locks();
  return 0;
}

Это избавило от всех странных ошибок с SSL_load_error_strings(); segfaults и условием двойного освобождения от glibc.

...