资讯专栏INFORMATION COLUMN

OpenSSL 简单思路和函数笔记

SHERlocked93 / 2700人阅读

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

一直以来都是普通的socket read/write,现在终于有基于SSL通道的项目了。所以简单记录了一下OpenSSL的调用流程,便于快速入门。
本文地址:https://segmentfault.com/a/11...

Reference

SSL编程- 简单函数介绍

ssl的消息读写以及和tcp语义的异同——(这篇文章很好)
——吐槽一下,这篇文章原作者都说了未经允许不得转载了,结果网上还是一堆抄的,唉,版权意识药丸药丸

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);        // 用于client
int 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

姊妹篇

mbedTLS(PolarSSL)简单思路和函数笔记

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9381.html

相关文章

  • mbedTLS(PolarSSL)简单思路函数笔记(Client端)

    摘要:一直以来各种被诟病,具体挑了哪些刺,本文就不深究。作为有很多替代,我了解到的有和。其中已经被收购了,改名为。最后一个参数使用即可。 OpenSSL一直以来各种被诟病,具体挑了哪些刺,本文就不深究。作为OpenSSL有很多替代,我了解到的有cyaSSL(WolfSSL)和PolorSSL。其中PolarSSL已经被ARM收购了,改名为mbedTLS。本文列举了作为一个SSL client...

    Taste 评论0 收藏0
  • 【周刊-2】三年大厂面试官-前端面试题(偏难)

    摘要:前言在大厂工作了年,当了年的前端面试官,把大厂常问的面试题与答案汇总在我的中。第题如何劫持的请求,提供思路难度阿里腾讯很多人在上搜索前端面试详解,把答案倒背如流,但是问到如何劫持请求的时候就一脸懵逼,是因为还是停留在理论性阶段。前言 在大厂工作了6年,当了3年的前端面试官,把大厂常问的面试题与答案汇总在我的Github中。希望对大家有所帮助,助力大家进入自己理想的企业。 项目地址是:git...

    silvertheo 评论0 收藏0
  • 【周刊-2】三年大厂面试官-前端面试题(偏难)

    摘要:前言在大厂工作了年,当了年的前端面试官,把大厂常问的面试题与答案汇总在我的中。第题如何劫持的请求,提供思路难度阿里腾讯很多人在上搜索前端面试详解,把答案倒背如流,但是问到如何劫持请求的时候就一脸懵逼,是因为还是停留在理论性阶段。 前言 在大厂工作了6年,当了3年的前端面试官,把大厂常问的面试题与答案汇总在我的Github中。希望对大家有所帮助,助力大家进入自己理想的企业。 项目地址是:...

    madthumb 评论0 收藏0
  • 【周刊-2】三年大厂面试官-前端面试题(偏难)

    摘要:前言在大厂工作了年,当了年的前端面试官,把大厂常问的面试题与答案汇总在我的中。第题如何劫持的请求,提供思路难度阿里腾讯很多人在上搜索前端面试详解,把答案倒背如流,但是问到如何劫持请求的时候就一脸懵逼,是因为还是停留在理论性阶段。 前言 在大厂工作了6年,当了3年的前端面试官,把大厂常问的面试题与答案汇总在我的Github中。希望对大家有所帮助,助力大家进入自己理想的企业。 项目地址是:...

    xi4oh4o 评论0 收藏0
  • 【周刊-2】三年大厂面试官-前端面试题(偏难)

    摘要:前言在大厂工作了年,当了年的前端面试官,把大厂常问的面试题与答案汇总在我的中。第题如何劫持的请求,提供思路难度阿里腾讯很多人在上搜索前端面试详解,把答案倒背如流,但是问到如何劫持请求的时候就一脸懵逼,是因为还是停留在理论性阶段。 前言 在大厂工作了6年,当了3年的前端面试官,把大厂常问的面试题与答案汇总在我的Github中。希望对大家有所帮助,助力大家进入自己理想的企业。 项目地址是:...

    joywek 评论0 收藏0

发表评论

0条评论

SHERlocked93

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<