专栏首页蓝天curl和https,及openssl

curl和https,及openssl

如果使用curl访问https(注意不是http),则会牵涉到OpenSSL,就需要注意多线程安全问题。 一是OpenSSL需要编译成多线程安全版本,二是需要为OpenSSL注册两个回调函数。如果不这样多线程环境应用时,会遇到coredump问题。

OpenSSL编程入门(含完整示例).pdf

ssl_test.zip

ssl_manager.zip OpenSSL初始化和注册两个回调函数可参考如下代码:

 CSSLmanager::CSSLmanager()
  
 : m_ctx(NULL), m_lock_cs(NULL)
 
 {
 
 }
 
 
 
 			void CSSLmanager::SSLFini()
 
 {
 
 			    CRYPTO_set_locking_callback(NULL);
 
 for (int i = 0; i < CRYPTO_num_locks(); i++) 
 
 {
 
 			        pthread_mutex_destroy(&m_lock_cs[i]);
 
 }
 
 
 
 			    OPENSSL_free(m_lock_cs);
 
 if (m_ctx != NULL)
 
 {
 
 			        SSL_CTX_free((SSL_CTX *)m_ctx);
 
 			        m_ctx = NULL; 
 
 }
 
 
 
 			    ERR_free_strings();
 
 			    EVP_cleanup();
 
 }
 
 
 
 			bool CSSLmanager::SSLInit(const TChar* cacert, const TChar * privkey)
 
 {
 
 			    SSL_library_init(); // SSL库初始化
 
 			    OpenSSL_add_all_algorithms(); // 载入所有 SSL 算法
 
 			    SSL_load_error_strings(); // 载入所有SSL错误消息
 
 
 
 while (true)
 
 {
 
 // 以 SSL V2 和 V3 标准兼容方式产生一个 SSL_CTX ,即 SSL Content Text
 
 			        SSL_CTX* ctx = SSL_CTX_new(SSLv23_server_method());
 
 if (NULL == ctx)
 
 			            break;
 
 
 
 // 载入用户的数字证书, 此证书用来发送给客户端,证书里包含有公钥
 
 if (SSL_CTX_use_certificate_file(ctx, cacert, SSL_FILETYPE_PEM) != 1)
 
 			            break;
 
 
 
 // 载入用户私钥
 
 if (SSL_CTX_use_PrivateKey_file(ctx, privkey, SSL_FILETYPE_PEM) != 1)
 
 			            break;
 
 
 
 // 检查用户私钥是否正确
 
 if (SSL_CTX_check_private_key(ctx) != 1)
 
 			            break;
 
 
 
 			        m_ctx = (void *)ctx;
 
 			        m_lock_cs = (pthread_mutex_t *)OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t));
 
 for (int i = 0; i < CRYPTO_num_locks(); ++i)
 
 {
 
 			            pthread_mutex_init(&(m_lock_cs[i]),NULL);
 
 }
 
 
 
 CRYPTO_set_id_callback(IDFunction); // 注册回调
 
 CRYPTO_set_locking_callback(LockingFunction); // 注册回调
 
 			        return true;
 
 }
 
 
 
 			    SSLFini();
 
 			    return false;
 
 }
 
 
 
 			unsigned long CSSLmanager::IDFunction( void )
 
 {
 
 			    return ((unsigned long)pthread_self());
 
 }
 
 
 
 			void CSSLmanager::LockingFunction(int mode, int type, const char *file, int line)
 
 {
 
 			    pthread_mutex_t* lock = CSSLmanager::singleton()->GetLock();
 
 
 
 if (mode & CRYPTO_LOCK) {
 
 			        pthread_mutex_lock(&lock[type]);
 
 } else {
 
 			        pthread_mutex_unlock(&lock[type]);
 
 }
 
 } 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「我真的没有改需求」

    非著名程序员
  • 你可以从面试中学到什么?

    讲一下我对面试的一些。。。“偏见”,哈哈,熟悉我的同学们一定要批判的读接下来的内容哈。

    web前端教室
  • 这是对付产品经理的一副毒药,程序员慎入

    程序员和产品经理的日常就像是一对天生的冤家,为了需求的实现,几乎天天在争吵。这不,就在昨天各大技术和产品群里一个程序员暴打产品经理的视频火了,被广泛传播。

    非著名程序员
  • 【系统设置】CentOS 修改机器名

    ken.io
  • 穿越十年后看互联网+:家电行业的金矿在哪里?

    现在市场上炒得火热的智能家居未来出路在何方?做智能家居的创业者应该注意哪些机会?传统家电厂商又到底如何借助互联网进行转型?本文以智能空调为例,用故事的形式,提前...

    华章科技
  • 白底黑字or黑底白字,眼睛更喜欢哪一个?

    腾讯大讲堂
  • 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

    haifeiWu
  • 知识体系解决迷茫的你

    最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

    桃翁
  • 今天我就说三句话

    腾讯NEXT学位
  • SQL中GROUP BY用法示例

    GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

    Awesome_Tang

扫码关注云+社区

领取腾讯云代金券