openssl API网络通信
1.本文是在别人的基础上,经过测试,大体总结的。操作环境ubuntu12和ubuntu14
*****************************************************************************************
"网络通信加密"
头文件:
#include <openssl/ssl.h>
#include <openssl/err.h>
OpenSSL流程和函数介绍
1.ssl库的初始化
int SSL_Library_init (void);
2.载入ssl所有的算法
void OpenSSL_add_all_algorithms();
3.载入ssl所有的错误信息
void SSL_load_error_strings();
4.选择会话协议
在利用OpenSSL开始SSL会话之前,需要为客户端和服务器制定本次会话采用的协议,目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。
需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。
OpenSSL中一个会话的环境称为“ CTX ”,申请CTX的函数是; const SSL_METHOD *SSLv23_client_method (void);
SSL_CTX *SSL_CTX_new (SSL_METHOD *method); //例如:SSL_CTX_new(SSLv23_server_method());
5.加载用户私钥:
1)有两种方式:私钥有密码, 私钥无密码
int SSL_CTX_use_Private_file (SSL_CTX *ctx, const char *file, int type); //例如:SSL_CTX_use_PrivateKey_file(tmp_ctx, privateKey, SSL_FILETYPE_PEM)
2)当私钥有密码时,获取私钥之前先把私钥的密码给写上
char *pKeyPasswd="serve";
SSL_CTX_set_default_passwd_cb_userdata(ctx, pKeyPasswd);
SSL_CTX_use_PrivateKey_file(ctx,s_cert_file,SSL_FILETYPE_PEM);
6.加载用户证书:
int SSL_CTX_use_certificate_file (SSL_CTX *ctx, const char *file, int type); //例如:SSL_CTX_use_certificate_file(tmp_ctx, certificate, SSL_FILETYPE_PEM)
7.验证私钥和证书是否相等
int SSL_CTX_check_private_key (SSL_CTX *ctx);
8.使用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
9.完成SSL握手
int SSL_connect (SSL *ssl); // 用于client
int SSL_accept (SSL *ssl); // 用于server
10.从SSL套接字中提取对方的证书信息
X509 *SSL_get_peer_certificate (SSL *ssl);
11.获取证书所有者的名字:
X509_NAME *X509_get_subject_name (X509 *a);
12.数据传输
int SSL_read (SSL *ssl, void *buf, int num);
int SSL_write (SSL *ssl, const void *buf, int num);
13.结束SSL通信
关闭SSL套接字
int SSL_shutdown (SSL *ssl);
释放SSL套接字
void SSL_free (SSL *ssl);
释放SSL会话
void SSL_CTX_free (SSL_CTX *ctx);
14.注意:注意
OpenSSL库中,各个函数的返回值的格式并不统一(有些用0表示失败,有些用0表示成功),请注意区分
用在OpenSSL的fd 不能 设置为 nonblock ,否则在 SSL_connect 时会失败——感觉这一点限制了OpenSSL与除了 libevent 之外其他异步I/O库的适配
*****************************************************************************************
openssl API网络通信的更多相关文章
- 使用 OpenSSL API 进行安全编程
创建基本的安全连接和非安全连接 Kenneth Ballard ( kenneth.ballard@ptk.org), 自由程序员 Kenneth 是 Peru State College(位于 Pe ...
- 使用OpenSSL API进行安全编程
http://www.ibm.com/developerworks/cn/linux/l-openssl.html OpenSSL API 的文档有些含糊不清.因为还没有多少关于 OpenSSL 使用 ...
- windows qt 使用openssl API
1.下载安装openssl http://dl.pconline.com.cn/download/355862-1.html 版本: OpenSSL(Win32) 1.0.1g 2.配置QT项目文件, ...
- OpenSSL密码算法库: MD5示例小程序
OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...
- 笔记整理——使用openssl编程
error: openssl 的所有解决方案 (2013/6/22 17:39:00) error: openssl/crypto.h: No such file or directory 解决方案 ...
- Windows7下使用mingw编译openssl
Windows7下使用mingw编译openssl 首先参考这篇文章安装mingw/minsys: http://blog.csdn.net/ubuntu64fan/article/details/8 ...
- openssl源代码结构
Openssl整个软件包主要包括三个主要的功能模块:密码算法库,SSL协议库,应用程序: 应用程序:主要包括密钥生成,证书管理,格式转换,数据加密,签名,SSL测试等. evp,对称算法,非对称算法, ...
- 基于OpenSSL的HTTPS通信C++实现
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.Nebula是一个为开发者提供一个快速开发 ...
- 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制
原文链接:http://guodayong.blog.51cto.com/263451/1181059 Openssl是SSL的开源实现(可以免费下载应用程序),是一种安全机密程序,主要用于提高远程登 ...
随机推荐
- python学习之路(一)屌丝逆袭之路
变量 ...
- kibana ,logstash and filebeat
https://www.elastic.co/guide/en/kibana/current/install.html https://www.elastic.co/guide/en/logstash ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十三)之附加功能-自定义皮肤
前言 本篇要讲的算是一个layim代码功能扩充.在原来的laim中已经有自带的换肤功能,而且在skin配置中,你可以添加自己想要的皮肤图片路径.这些内容在接下来都不会涉及,本篇要讲的是自定义皮肤功能, ...
- Array补充方法
Array.prototype.Contain = function (item) { var arr = this; if (arr == null || arr.length == 0) { re ...
- 关于windows字体的一些笔记
windows如何管理字体 windows的字体管理在注册表的windows/font这部分(具体路径忘记了),这里会记录字体的名称和名称,如果有具体指出路径,windows启动的时候会从这个路径去加 ...
- python学习-day20、装饰器【图片缺失可看】印象笔记博客备份
前言: 装饰器用于装饰某些函数或者方法,或者类.可以在函数执行之前或者执行之后,执行一些自定义的操作. 1.定义:装饰器就是一个函数,为新定义的函数.把原函数嵌套到新函数里面.以后就可以在执行新函数的 ...
- 报错:HTTP Status 404 - There is no Action mapped for namespace [/] and action name [product-save] associated with context path [/20161101-struts2-2].
运行:index.jsp---->input.jsp----->details.jsp,但是在input.jsp到details.jsp的时候报错误. 异常如下: 严重: Could no ...
- 关于oracle修复控制文件与数据文件不一致的问题----
本小菜鸟周末鼓捣数据库关于rman恢复与备份方面的实验,结果不知道哪根筋搭错了,手一哆嗦,做了不知道什么操作,就出现了数据库打不开的严重状态,只能开启到mount状态,但是切换到open状态时就会报错 ...
- 【javascript基础】8、闭包
前言 函数和作用域啥的我们前面已经了解了,现在就要学习闭包了,这是一个挺晦涩的知识点,初学者可能会感觉不好理解,但是高手都不不以为然了,高手就给我提点意见吧,我和新手一起来学习什么是闭包. 例子 先不 ...
- java maven诡异的错误no class found
从服务器下载一个java web项目,启动老提示no class found,查看maven依赖库,相关的jar包都已经引入.同样一个项目,在别的机器都可以运行,唯独在我本机运行出错. 为了排错,将其 ...