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网络通信的更多相关文章

  1. 使用 OpenSSL API 进行安全编程

    创建基本的安全连接和非安全连接 Kenneth Ballard ( kenneth.ballard@ptk.org), 自由程序员 Kenneth 是 Peru State College(位于 Pe ...

  2. 使用OpenSSL API进行安全编程

    http://www.ibm.com/developerworks/cn/linux/l-openssl.html OpenSSL API 的文档有些含糊不清.因为还没有多少关于 OpenSSL 使用 ...

  3. windows qt 使用openssl API

    1.下载安装openssl http://dl.pconline.com.cn/download/355862-1.html 版本: OpenSSL(Win32) 1.0.1g 2.配置QT项目文件, ...

  4. OpenSSL密码算法库: MD5示例小程序

    OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...

  5. 笔记整理——使用openssl编程

    error: openssl 的所有解决方案 (2013/6/22 17:39:00) error: openssl/crypto.h: No such file or directory 解决方案 ...

  6. Windows7下使用mingw编译openssl

    Windows7下使用mingw编译openssl 首先参考这篇文章安装mingw/minsys: http://blog.csdn.net/ubuntu64fan/article/details/8 ...

  7. openssl源代码结构

    Openssl整个软件包主要包括三个主要的功能模块:密码算法库,SSL协议库,应用程序: 应用程序:主要包括密钥生成,证书管理,格式转换,数据加密,签名,SSL测试等. evp,对称算法,非对称算法, ...

  8. 基于OpenSSL的HTTPS通信C++实现

      HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.Nebula是一个为开发者提供一个快速开发 ...

  9. 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制

    原文链接:http://guodayong.blog.51cto.com/263451/1181059 Openssl是SSL的开源实现(可以免费下载应用程序),是一种安全机密程序,主要用于提高远程登 ...

随机推荐

  1. 由javascript中的this指针所想到的

    初次结识 this 指针,是在学 <<C++ Primer Plus>>这本书的时候(这本书勉强读了一二遍,之后转学 html+css+js了,不过这是后话). 依稀记得书中举 ...

  2. 化繁为简 如何向老婆解释MapReduce?(转载)

    化繁为简 如何向老婆解释MapReduce? 昨天,我在Xebia印度办公室发表了一个关于MapReduce的演说.演说进行得很顺利,听众们都能够理解MapReduce的概念(根据他们的反馈).我成功 ...

  3. Android服务之Service(其一)

    android中服务是运行在后台的东西,级别与activity差不多.既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西.你可以启动一个服务Service来播放音乐,或者记录你 ...

  4. python数据分析之pandas库的DataFrame应用一

    DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔型).DateFrame既有行索引也有列索引,可以被看作为由Series组成的字典. 构建Dat ...

  5. ajax 开始的loading加载

    注意是异步加载方式 $.ajax({ beforeSend:function(){ $("#showMes").html('loading...'); },  success: f ...

  6. Hadoop 2.6.4单节点集群配置

    1.安装配置步骤 # wget http://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm # rpm -i ...

  7. Js操作DOM小练习_01

    1.页面引入jQuery文件和bootstrap文件: 2.贴上代码 <!DOCTYPE html> <html lang="en"> <head&g ...

  8. WebApi:自定义筛选器

    最近在项目中有这样一个需求,记录每次Api访问的调用时间,运行时间,传入数据,返回数据等信息. 第一反应就是添加一个类,用来实现相应的功能,然后在方法的代码中添加,但是这样的话,需要修改所有的方法的代 ...

  9. UVA 753 UNIX 插头(EK网络流+Floyd传递闭包)

    UNIX 插头 紫书P374 [题目链接]UNIX 插头 [题目类型]EK网络流+Floyd传递闭包 &题解: 看了书之后有那么一点懂了,但当看了刘汝佳代码后就完全明白了,感觉他代码写的好牛逼 ...

  10. Java中Enum类型的序列化(转)

    在Java中,对Enum类型的序列化与其他对象类型的序列化有所不同,今天就来看看到底有什么不同.下面先来看下在Java中,我们定义的Enum在被编译之后是长成什么样子的. Java代码: Java代码 ...