博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenSSL 简单思路和函数笔记
阅读量:6233 次
发布时间:2019-06-21

本文共 2139 字,大约阅读时间需要 7 分钟。

一直以来都是普通的socket read/write,现在终于有基于SSL通道的项目了。所以简单记录了一下OpenSSL的调用流程,便于快速入门。

本文地址:

Reference

  • ——(这篇文章很好)
    ——吐槽一下,这篇文章原作者都说了未经允许不得转载了,结果网上还是一堆抄的,唉,版权意识药丸药丸

OpenSSL流程和函数介绍

初始化

int SSL_Library_init (void);

选择会话协议和创建会话环境

目前支持的会话协议包括:TLSv1.0, SSLv2, SSLv3, SSLv2/v3

OpenSSL中一个会话的环境称为“CTX”,申请CTX的函数是:

SSL_CTX *SSL_CTX_new (SSL_METHOD *method);

其中method就是会话协议,比如SSLv2/v3的client,则传入函数调用的返回值:

const SSL_METHOD *SSLv23_client_method (void);

接下来是设置CTX的属性,比如制定证书验证方式:

int SSL_CTX_set_verify (SSL_CTX *ctx,                         int mode,                         int (*verify_callback),                         int (X509_STROE_CTX *));

加载CA证书:

SSL_CTX_load_varify_location (SSL_CTX *ctx, const char *Cafile, const char *Capath);

加载用户私钥:

SSL_CTX_use_Private_file (SSL_CTX *ctx, const char *file, int type);

加载用户证书:

SSL_CTX_use_certificate_file (SSL_CTX *ctx, const char *file, int type);

验证私钥和证书是否相等

int SSL_CTX_check_private_key (SSL_CTX *ctx);

建立SSL套接字

SSL *SSL_new (SSL_CTX *ctx);

使用socket绑定SSL套接字:

int SSL_set_fd (SSL *ssl, int fd);int SSL_set_rfd (SSL *ssl, int fd);    // 只读int SSL_set_wfd (SSL *ssl, int fd);    // 只写

注意:上述三个函数成功时返回TRUE,失败时返回FALSE

完成SSL握手

int SSL_connect (SSL *ssl);        // 用于clientint SSL_accept  (SSL *ssl);        // 用于client

从SSL套接字中提取对方的证书信息

X509 *SSL_get_peer_certificate (SSL *ssl);

获取证书所有者的名字:

X509_NAME *X509_get_subject_name (X509 *a);

数据传输

int SSL_read  (SSL *ssl, void *buf, int num);int SSL_write (SSL *ssl, const void *buf, int num);

结束SSL通信

关闭SSL套接字

int SSL_shitdown (SSL *ssl);

释放SSL套接字

void SSL_free (SSL *ssl);

释放SSL会话

void SSL_CTX_free (SSL_CTX *ctx);

OpenSSL应用编程框架

下面大致的伪代码说明了调用SSL的一整个流程

Client端

ctx = SSL_CTX_new (SSLv23_client_method());ssl = SSL_new (ctx);fd = socket ();connect ();SSL_set_fd (ssl, fd);SSL_connect (ssl);SSL_write ();

Server端

ctx = SSL_CTX_new (SSLv23_server_method());ssl = SSL_new (ctx);fd = socket ();bind ();listen ();accept ();SSL_set_fd (ssl, fd);SSL_accept (ssl);SSL_read ();

注意

  • OpenSSL库中,各个函数的返回值的格式并不统一(有些用0表示失败,有些用0表示成功),请注意区分
  • 用在OpenSSL的fd不能设置为nonblock,否则在SSL_connect时会失败——感觉这一点限制了OpenSSL与除了libevent之外其他异步I/O库的适配
  • 关于nonblock的问题,感谢的补充:可以在完成了SSL_connect/accept之后,将fd设置为nonblock

姊妹篇

你可能感兴趣的文章
Eclipse中绑定java源代码
查看>>
Hadoop学习笔记(1):WordCount程序的实现与总结
查看>>
Java IO最详解
查看>>
概率论 --- Uva 11181 Probability|Given
查看>>
nginx配置允许指定域名下所有二级域名跨域请求
查看>>
valgrind内存检测工具
查看>>
[论文泛读] Integrating human-services using WebComposition/UIX (PDT, 2011)
查看>>
mysql 以及在python中使用pymysql操作数据库
查看>>
VGDB提示
查看>>
关于错误error C4430 error C2365 error C2078 error C2440 error C2143的处理。
查看>>
背包问题
查看>>
Windows 7中使用Eclipse 使用CDT and WinGW 开发C/C++(转载)
查看>>
project修改时间日历
查看>>
kali 终端真透明
查看>>
具体数学第二版第四章习题(3)
查看>>
action继承actionSupport
查看>>
你真的会玩SQL吗?无处不在的子查询
查看>>
更新SVN时提示要清理,但清理失败,乱码得解决方案
查看>>
Rich控件一
查看>>
授权对象的检查
查看>>