前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >curl和https,及openssl

curl和https,及openssl

作者头像
一见
发布2018-08-10 15:41:55
1.6K0
发布2018-08-10 15:41:55
举报
文章被收录于专栏:蓝天

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

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

ssl_test.zip

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

代码语言:javascript
复制
 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]);
 
 }
 
 } 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015/06/12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档