c语言开发ssl,SSL编程简介
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编程简介相关推荐
- python基于c语言开发_C高级编程:基于模块化设计思想的C语言开发 PDF 超清版
给大家带来的一篇关于C语言相关的电子书资源,介绍了关于C高级编程.模块化.设计思想.C语言开发方面的内容,本书是由机械工业出版社出版,格式为PDF,资源大小80 MB,吉星编写,目前豆瓣.亚马逊.当当 ...
- win32编程与c语言的关系,Windows 编程简介 c/c++/win32
Windows 编程简介 一.从C/C++到Windows编程 前面我们学习的C/C++程序都是DOS程序(或称为Windows控制台程序),也就是现在大学里的开设的<C/C++程序设计> ...
- python是什么语言开发的-少儿编程有什么好处?儿童编程课程学习Python的4大原因...
儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...
- 敢为人先,华为不惧C语言开发仓颉汉语编程,中文编程迎来新生态
近年来,华为不惜投入巨资开发名为"仓颉(jié)"的中文编程语言,如此执着这是为何? 对此不少网友颇为质疑,毕竟C语言.Java,乃至如日中天的python才是程序员常用的编程语言 ...
- linux下的C语言开发(网络编程)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 不管在Windows平台下面还是在Linux平台下面,网络编程都是少不了的.在互联网发达的今天 ...
- c语言开发数控软件编程电源,基于单片机数控电源设计.doc
基于单片机数控电源设计 1 绪论 在现在的生活中,我们常常会用到各种电源,电源技术服务于各行各业.直流稳压电源是电子技术中常用设备,广泛应用于实验.教学.科研等领域.数控电源一般采用单片机系统来构成. ...
- linux下的C语言开发(多线程编程)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 多线程和多进程还是有很多区别的.其中之一就是,多进程是linux内核本身所支持的,而多线程则需 ...
- c语言开发网站教程,C语言也能干大事之C语言开发网站教程
教程名称:C语言也能干大事之C语言开发网站教程 课程简介: 本章主干知识点:现在做桌面窗口程序开发的工作已经不多了,目前企业需求量最大的技术是"网站开发".因此发布一套<C语 ...
- linux下的C语言开发
在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...
最新文章
- 【网络编程】epoll 笔记
- [生活化技术]组合模式 vs. 理发店价格表
- 如何在Mac OS下用ISO包制作启动U盘
- 图像降噪算法——中值滤波/均值滤波/高斯滤波/双边滤波
- ASP.NET MVC编程——控制器
- iOS开发UI篇—Quartz2D使用(绘图路径)
- 二叉搜索树python,代表python中的二叉搜索树
- Linux 驱动开发之内核模块开发(四)—— 符号表的导出
- mpu6050 重力加速度_2021年高考物理一轮复习学与练 重力、弹力 、摩擦力 高中物理知识总结大全...
- 视觉SLAM——ceres非线性最小二乘求解器
- password textbox setup
- 【Java每日一题】20161124
- 在Windows上搭建Go开发环境
- 怎么将后缀为.opt,.frm,.myd,.myi文件还原或者是导入mySQL中
- eWebEditor浏览器兼容 ie8 ie7
- 如何以最好的方式实现游戏关卡
- 2020最新的eclipse之安卓开发环境搭建
- 极客学院微信小程序视频教程
- 【蓝桥杯冲刺 day12】题目全解析
- Java DataSource对象