OpenSSL是一个开放源代码的SSL协议实现,采用C语言作为开发语言,具备了跨系统的性能。调用OpenSSL的函数就可以实现一个SSL加密的安全数据传输通道,从而保护客户端和服务器之间数据的安全。

头文件:

#include

#include

在使用OpenSSL之前,必须进行相应的协议初始化工作,这可以通过下面的函数实现:

int SSL_library_int(void);

在开始SSL会话之前,需要为客户端和服务器制定本次会话采用的协议,目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。

在OpenSSL中创建的SSL会话环境称为CTX,使用不同的协议会话,其环境也不一样的。申请SSL会话环境的OpenSSL函数是:

SSL_CTX *SSL_CTX_new(SSL_METHOD *method);

当SSL会话环境申请成功后,还要根据实际的需要设置CTX的属性,通常的设置是指定SSL握手阶段证书的验证方式和加载自己的证书。制定证书验证方式的函数是:

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

为SSL会话环境加载CA证书的函数是:

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

为SSL会话加载用户证书的函数是:

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

为SSL会话加载用户私钥的函数是:

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

在将证书和私钥加载到SSL会话环境之后,就可以调用下面的函数来验证私钥和证书是否相符:

int SSL_CTX_check_private_key(SSL_CTX *ctx);

SSL套接字是建立在普通的TCP套接字基础之上,在建立SSL套接字时可以使用下面的一些函数:

SSL *SSl_new(SSL_CTX *ctx); // 申请一个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); // 绑定只写套接字

在成功创建SSL套接字后,客户端应使用函数SSL_connect()替代传统的函数connect()来完成握手过程:

int SSL_connect(SSL *ssl);

而对服务器来讲,则应使用函数SSL_ accept()替代传统的函数accept()来完成握手过程:

int SSL_accept(SSL *ssl);

握手过程完成之后,通常需要询问通信双方的证书信息,以便进行相应的验证,这可以借助于下面的函数来实现:

X509 *SSL_get_peer_certificate(SSL *ssl);

该函数可以从SSL套接字中提取对方的证书信息,这些信息已经被SSL验证过了。

得到证书所用者的名字:

X509_NAME *X509_get_subject_name(X509 *a);

当SSL握手完成之后,就可以进行安全的数据传输了,在数据传输阶段,需要使用SSL_read()和SSL_write()来替代传统的read()和write()函数,来完成对套接字的读写操作:

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

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

当客户端和服务器之间的数据通信完成之后,调用下面的函数来释放已经申请的SSL资源:

int SSL_shutdown(SSL *ssl); // 关闭SSL套接字

void SSl_free(SSL *ssl); // 释放SSL套接字

void SSL_CTX_free(SSL_CTX *ctx); // 释放SSL会话环境

客户端程序的框架:

meth = SSLv23_client_method();

ctx = SSL_CTX_new(meth);

ssl = SSL_new(ctx);

fd = socket();

connect();

SSL_set_fd(ssl, fd);

SSL_connect(ssl);

SSL_write(ssl, "Hello world", strlen("Hello World!"));

服务端程序的框架:

meth = SSLv23_server_method();

ctx = SSL_CTX_new(meth);

ssl = SSL_new(ctx);

fd = socket();

bind();

listen();

accept();

SSL_set_fd(ssl, fd);

SSL_connect(ssl);

SSL_read(ssl, buf, sizeof(buf));

OpenSSL中的SSL安全通信可以分为两类,两类基本上的操作相同,一类是建立SSL环境后使用BIO读写,另一类是直接在socket上建立SSL上下文环境。在OpenSSL的安装目录下的misc目录下,运行脚本sudo ./CA.sh -newca,根据提示填写信息完成后会生成一个demoCA的目录,里面存放了CA的证书和私钥。

生成客户端和服务器证书申请:

$ openssl req -newkey rsa:1204 -out sslclientreq.pem -keyout sslclientkey.pem

$ openssl req -newkey rsa:1204 -out sslserverreq.pem -keyout sslserverkey.pem

签发客户端和服务器证书:

$ openssl ca -in sslclientreq.pem -out sslclientcert.pem

$ openssl ca -in sslserverreq.pem -out sslservercert.pem

参考文章

c语言开发ssl,SSL编程简介相关推荐

  1. python基于c语言开发_C高级编程:基于模块化设计思想的C语言开发 PDF 超清版

    给大家带来的一篇关于C语言相关的电子书资源,介绍了关于C高级编程.模块化.设计思想.C语言开发方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小80 MB,吉星编写,目前豆瓣.亚马逊.当当 ...

  2. win32编程与c语言的关系,Windows 编程简介 c/c++/win32

    Windows 编程简介 一.从C/C++到Windows编程 前面我们学习的C/C++程序都是DOS程序(或称为Windows控制台程序),也就是现在大学里的开设的<C/C++程序设计> ...

  3. python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  4. 敢为人先,华为不惧C语言开发仓颉汉语编程,中文编程迎来新生态

    近年来,华为不惜投入巨资开发名为"仓颉(jié)"的中文编程语言,如此执着这是为何? 对此不少网友颇为质疑,毕竟C语言.Java,乃至如日中天的python才是程序员常用的编程语言 ...

  5. linux下的C语言开发(网络编程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 不管在Windows平台下面还是在Linux平台下面,网络编程都是少不了的.在互联网发达的今天 ...

  6. c语言开发数控软件编程电源,基于单片机数控电源设计.doc

    基于单片机数控电源设计 1 绪论 在现在的生活中,我们常常会用到各种电源,电源技术服务于各行各业.直流稳压电源是电子技术中常用设备,广泛应用于实验.教学.科研等领域.数控电源一般采用单片机系统来构成. ...

  7. linux下的C语言开发(多线程编程)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 多线程和多进程还是有很多区别的.其中之一就是,多进程是linux内核本身所支持的,而多线程则需 ...

  8. c语言开发网站教程,C语言也能干大事之C语言开发网站教程

    教程名称:C语言也能干大事之C语言开发网站教程 课程简介: 本章主干知识点:现在做桌面窗口程序开发的工作已经不多了,目前企业需求量最大的技术是"网站开发".因此发布一套<C语 ...

  9. linux下的C语言开发

    在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...

最新文章

  1. 【网络编程】epoll 笔记
  2. [生活化技术]组合模式 vs. 理发店价格表
  3. 如何在Mac OS下用ISO包制作启动U盘
  4. 图像降噪算法——中值滤波/均值滤波/高斯滤波/双边滤波
  5. ASP.NET MVC编程——控制器
  6. iOS开发UI篇—Quartz2D使用(绘图路径)
  7. 二叉搜索树python,代表python中的二叉搜索树
  8. Linux 驱动开发之内核模块开发(四)—— 符号表的导出
  9. mpu6050 重力加速度_2021年高考物理一轮复习学与练 重力、弹力 、摩擦力 高中物理知识总结大全...
  10. 视觉SLAM——ceres非线性最小二乘求解器
  11. password textbox setup
  12. 【Java每日一题】20161124
  13. 在Windows上搭建Go开发环境
  14. 怎么将后缀为.opt,.frm,.myd,.myi文件还原或者是导入mySQL中
  15. eWebEditor浏览器兼容 ie8 ie7
  16. 如何以最好的方式实现游戏关卡
  17. 2020最新的eclipse之安卓开发环境搭建
  18. 极客学院微信小程序视频教程
  19. 【蓝桥杯冲刺 day12】题目全解析
  20. Java DataSource对象

热门文章

  1. Sqlite case函数
  2. Assemble汇编语言设计技术
  3. 2018.12.5【WC2017】【LOJ2286】【洛谷P4604】挑战(卡常)
  4. 个人职业目标如何计算机,个人职业目标规划
  5. 构造函数和析构函数的顺序问题
  6. SecureKey安全桌面控制系统
  7. 来自LinuxAid的2004年9月盘点
  8. 12月初总结--无名之辈
  9. 关于移动硬盘分区的经验
  10. 影酷钜浪动力挑战3万公里大环行,一箱油驰骋超一千公里!