curl和https,及openssl

简介: 如果使用curl访问https(注意不是http),则会牵涉到OpenSSL,就需要注意多线程安全问题。 一是OpenSSL需要编译成多线程安全版本,二是需要为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. }

相关文章
|
5月前
|
网络协议 安全
【专栏】`curl`是广泛用于网络编程和自动化脚本的命令行工具,支持HTTP、HTTPS等协议
【4月更文挑战第28天】`curl`是广泛用于网络编程和自动化脚本的命令行工具,支持HTTP、HTTPS等协议。在处理大文件或慢速服务器时,设置超时参数至关重要。本文介绍了`curl`的超时参数,如`-m`(最大操作时间)、`-c`(连接超时)、`--dns-timeout`(DNS解析超时)和`-t`(时间条件)。通过示例展示了如何设置这些超时,并提到了一些高级技巧和注意事项,如错误处理和带宽限制。合理设置超时能提高效率和可靠性,对编写健壮的自动化脚本非常有用。
149 0
|
5月前
【Error】fatal: unable to access ‘https://github.com/PanJiaChen/vue-element-admin/‘: OpenSSL SSL_read:
【Error】fatal: unable to access ‘https://github.com/PanJiaChen/vue-element-admin/‘: OpenSSL SSL_read:
|
11月前
|
安全 数据安全/隐私保护
使用openssl 模拟ca进行证书的申请和颁发,并使用证书部署网站的安全连接访问,即https的加密通信
使用openssl 模拟ca进行证书的申请和颁发,并使用证书部署网站的安全连接访问,即https的加密通信
74 0
|
12月前
|
Cloud Native Go API
猫头虎解析:深入浅出cURL命令和HTTP请求
猫头虎解析:深入浅出cURL命令和HTTP请求
174 0
|
12月前
|
Cloud Native Go API
使用 cURL 发送 HTTP 请求: 深入探讨与示例
使用 cURL 发送 HTTP 请求: 深入探讨与示例
319 0
|
JSON 安全 测试技术
curl命令行工具调试http接口使用小结
curl命令行工具调试http接口使用小结
|
PHP C语言
使用curl工具调试https接口
使用curl工具调试https接口
|
消息中间件 Linux 网络安全
让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
|
搜索推荐
通过curl 来对比http状态码301和302
通过curl 来对比http状态码301和302
252 0