Учебник по использованию OpenSSL с pthreads
документы OpenSSL укажите, что его можно безопасно использовать в многопоточных приложениях при условии, что установлены по крайней мере две функции обратного вызова: locking_function и threadid_func....
Я написал программы, которые используют OpenSSL API. Более того, я знаю, как использовать pthreads. Тем не менее, документы OpenSSL написаны в виде руководства, и я не вижу пошагового руководства о том, что мне нужно делать при использовании OpenSSL в многопоточном приложении.
Is есть учебник по использованию OpenSSL с pthreads? (Я искал в интернете, но не получил удовлетворительного результата.)
PS: Я работаю в Debian Lenny & Ubuntu Lucid/Maverick.
PS2: в OpenSSL включает в себя образец, но это слишком сложно для начала.
4 ответов
Не знаю о учебнике, но вот два примера на основе libcurl, которые могут помочь:
http://curl.haxx.se/libcurl/c/opensslthreadlock.html
http://curl.haxx.se/libcurl/c/threaded-ssl.html
Глава 10 книги окончательное руководство по сетевому программированию Linux включает в себя раздел Потокобезопасное Программирование с OpenSSL (на стр. 255-259). В этом разделе подробно описывается работа библиотеки OpenSSL и pthreads. В частности, он рассказывает, как настроить функции обратного вызова как в статическом распределении (где количество потоков известно априори) и динамическое распределение (где потоки создаются и уничтожаются на лети!--6-->).
еще один хороший источник-раздел 4.1 книги сетевая безопасность с OpenSSL, под названием Поддержкой Многопоточного. Это обеспечивает статический/динамический механизмы распределения в подразделах 4.1.1 и 4.1.2 соответственно.
наконец, есть книги Unix-Netzwerkprogrammierung mit Threads, Sockets und SSL, который на сегодняшний день является наиболее всеобъемлющим по теме. К сожалению, английский перевод этого немецкого книга недоступна.
openssl должен быть настроен с параметром потоков
./config thread -D_REENTRANT
это вопрос копирования и вставки; шарик OpenSSL tar включает образец в файле
crypto/threads/mttest.c
скопируйте соответствующую платформу конкретной реализации & вызов thread_setup для инициализации и thread_cleanup для wrap up;
основываясь на ответе Wodin с использованием ссылок 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.