curl和https,及openssl

如果使用curl访问 https(注意不是http),则会牵涉到 OpenSSL,就需要注意多线程安全问题。

一是 OpenSSL需要编译成多线程安全版本,二是需要为 OpenSSL注册两个回调函数。如果不这样多线程环境应用时,会遇到coredump问题。

img_e25d4fb2f8de1caf41a735ec53088516.pngOpenSSL编程入门(含完整示例).pdf  img_e25d4fb2f8de1caf41a735ec53088516.pngssl_test.zip  img_e25d4fb2f8de1caf41a735ec53088516.pngssl_manager.zip
OpenSSL初始化和注册两个回调函数可参考如下代码:

  1. CSSLmanager::CSSLmanager()
  2.     : m_ctx(NULL), m_lock_cs(NULL)
  3. {
  4. }

  5. void CSSLmanager::SSLFini()
  6. {
  7.     CRYPTO_set_locking_callback(NULL);
  8.     for (int i = 0; i CRYPTO_num_locks(); i++)
  9.     {
  10.         pthread_mutex_destroy(&m_lock_cs[i]);
  11.     }

  12.     OPENSSL_free(m_lock_cs);
  13.     if (m_ctx != NULL)
  14.     {
  15.         SSL_CTX_free((SSL_CTX *)m_ctx);
  16.         m_ctx = NULL;
  17.     }

  18.     ERR_free_strings();
  19.     EVP_cleanup();
  20. }

  21. bool CSSLmanager::SSLInit(const TChar* cacert, const TChar * privkey)
  22. {
  23.     SSL_library_init(); // SSL库初始化
  24.     OpenSSL_add_all_algorithms(); // 载入所有 SSL 算法
  25.     SSL_load_error_strings(); // 载入所有SSL错误消息
  26.     
  27.     while (true)
  28.     {
  29.         // 以 SSL V2 和 V3 标准兼容方式产生一个 SSL_CTX ,即 SSL Content Text
  30.         SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
  31.         if (NULL == ctx)
  32.             break;
  33.         
  34.         // 载入用户的数字证书, 此证书用来发送给客户端,证书里包含有公钥
  35.         if (SSL_CTX_use_certificate_file(ctx, cacert, SSL_FILETYPE_PEM) != 1)
  36.             break;

  37.         // 载入用户私钥
  38.         if (SSL_CTX_use_PrivateKey_file(ctx, privkey, SSL_FILETYPE_PEM) != 1)
  39.             break;

  40.         // 检查用户私钥是否正确
  41.         if (SSL_CTX_check_private_key(ctx) != 1)
  42.             break;

  43.         m_ctx = (void *)ctx;
  44.         m_lock_cs = (pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
  45.         for (int i = 0; i CRYPTO_num_locks(); ++i)
  46.         {
  47.             pthread_mutex_init(&(m_lock_cs[i]),NULL);
  48.         }

  49.         CRYPTO_set_id_callback(IDFunction); // 注册回调
  50.         CRYPTO_set_locking_callback(LockingFunction); // 注册回调
  51.         return true;
  52.     }

  53.     SSLFini();
  54.     return false;
  55. }

  56. unsigned long CSSLmanager::IDFunction( void )
  57. {
  58.     return ((unsigned long)pthread_self());
  59. }

  60. void CSSLmanager::LockingFunction(int mode, int type, const char *file, int line)
  61. {
  62.     pthread_mutex_t* lock = CSSLmanager::singleton()->GetLock();

  63.     if (mode & CRYPTO_LOCK) {
  64.         pthread_mutex_lock(&lock[type]);
  65.     } else {
  66.         pthread_mutex_unlock(&lock[type]);
  67.     }
  68. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值