使用OpenSSL和pthreads的教程

时间:2010-10-12 22:03:47

标签: reference pthreads openssl

OpenSSL documents表示只要设置了至少两个回调函数,lock_function和threadid_func ....

我编写了使用OpenSSL API的程序。而且,我知道如何使用pthreads。但是,OpenSSL文档是以手册的形式编写的,我无法看到在多线程应用程序中使用OpenSSL时我必须要做的一步一步的指南。

是否有关于使用pSreads使用OpenSSL的教程? (我在网上搜索,但没有出现满意的结果。)

PS:我在Debian Lenny& Ubuntu Lucid / Maverick。

PS2: OpenSSL包含一个示例,但它开始时太复杂了。

4 个答案:

答案 0 :(得分:10)

不知道有关教程,但这里有两个基于libcurl的示例可能会有所帮助:

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

答案 1 :(得分:9)

本书的第10章The Definitive Guide to Linux Network Programming包括使用OpenSSL进行线程安全编程(第255-259页)。本节详细介绍了OpenSSL和pthreads库的工作原理。特别是,它告诉我们如何在静态分配(其中线程数已知先验)和动态分配(其中线程被创建和销毁)中设置回调函数)。

另一个好消息来源是本书Network Security with OpenSSL的第4.1节,标题为多线程支持。它分别在4.1.1和4.1.2小节中提供静态/动态分配机制。

最后,还有一本书Unix-Netzwerkprogrammierung mit Threads, Sockets und SSL,这是迄今为止关于这一主题的最全面的一本书。不幸的是,这本德国书的英文翻译不可用。

答案 2 :(得分:8)

  • 必须使用线程选项./config thread -D_REENTRANT

  • 配置openssl
  • 这是一个复制和问题的问题。糊; openssl tar ball包含文件crypto/threads/mttest.c

  • 中的样本

复制相关平台的具体实施&调用thread_setup进行初始化,调用thread_cleanup进行包装;

答案 3 :(得分:4)

基于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;
}

用glibc中的SSL_load_error_strings();段错误和双重自由条件消除了所有奇怪的错误。