tls建立流程范例
时间:2019-10-22
本文章向大家介绍tls建立流程范例,主要包括tls建立流程范例使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1、SSL初始化: bool init(string certFile, string privFile) { SSL_load_error_strings (); int r = SSL_library_init (); if (r == 0) { return false; } ssl_ctx = SSL_CTX_new (SSLv23_method ()); if (ssl_ctx == NULL) { printf("SSL_library_init failed \n"); return false; } err_bio = BIO_new_fd(2, BIO_NOCLOSE); r = SSL_CTX_use_certificate_file(ssl_ctx, certFile.c_str(), SSL_FILETYPE_PEM); if (r <= 0) { printf("SSL_CTX_use_certificate_file %s failed \n", certFile.c_str()); return false; } r = SSL_CTX_use_PrivateKey_file(ssl_ctx, privFile.c_str(), SSL_FILETYPE_PEM); if (r <= 0) { printf("SSL_CTX_use_PrivateKey_file %s failed \n", privFile.c_str()); return false; } r = SSL_CTX_check_private_key(ssl_ctx); if (r == 0) { printf("SSL_CTX_check_private_key failed \n"); return false; } printf("SSL inited success\n"); return true; } 2、握手协商: int SSLHandshake() { // 在未建立ssl连接之前,应将读写事件添加至epoll中 if (!tcp_connected) { struct pollfd pfd; pfd.fd = fd; pfd.events = POLLOUT | POLLERR; int r = poll(&pfd, 1, 0); if (r == 1 && pfd.revents == POLLOUT) { printf("tcp connected fd:%d\n", fd); tcp_connected = true; //注册读写事件 SetEvent(FD_SEND|FD_RECV|FD_CLOSE|FD_ERROR); } else { printf("poll fd:%d return %d revents %d\n", fd, r, pfd.revents); return -1; } } //如果ssl为null,使用已建立连接的socket初始化ssl if (ssl == NULL) { ssl = SSL_new(ssl_ctx); if (ssl == NULL) { printf("SSL_new failed, fd:%d \n", fd); return -1; } int r = SSL_set_fd(ssl, fd); if (r == 0) { printf("SSL_set_fd failed fd:%d \n", fd); } printf("SSL_set_accept_state for fd:%d \n", fd); SSL_set_accept_state(ssl); } int r = SSL_do_handshake(ssl); //若返回值为1,则SSL握手已完成 if (r == 1) { ssl_connected = true; printf("SSL_do_handshake connected success fd:%d\n", fd); return 0; } //处理握手完成后,应该将相应事件移除 int err = SSL_get_error(ssl, r); if (err == SSL_ERROR_WANT_WRITE) { //移除读事件 SetEvent(FD_SEND|FD_CLOSE|FD_ERROR); printf("SSL_get_error return want write set events, fd:%d \n", fd); return -2; } else if (err == SSL_ERROR_WANT_READ) { //移除写事件 SetEvent(FD_RECV|FD_CLOSE|FD_ERROR); printf("SSL_get_error return want read set events, fd:%d \n", fd); return -2; } else { printf("SSL_get_error return %d error %d errno %d msg %s fd:%d \n" , r, err, errno, strerror(errno), fd); return -1; } }
原文地址:https://www.cnblogs.com/share-ideas/p/11718904.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C# 关键字之 decimal
- 设计模式(8)[JS版]-JavaScript设计模式之如何实现适配器模式???
- Python3与OpenCV3.3 图像处理(二)--图像基本操作
- 前端基础:ECMAScript 6
- 设计模式(9)[JS版]-JavaScript设计模式之如何实现桥接模式???
- 前端基础:Boostrap
- 设计模式(10)[JS版]-JavaScript如何实现组合模式???
- JavaWeb - Servlet:基本概念,HTTP 协议,Tomcat 服务器
- 漫画:设计模式之 “工厂模式”
- 设计模式(11)[JS版]-JavaScript中的注解之装饰器模式
- JavaWeb - Servlet:重定向和转发,状态管理
- 设计模式(12)[JS版]--JavaScript必会设计模式之外观模式(Façade Pattern)
- JavaWeb - JSP:概述和语法,内置对象,JavaBean 组件,MVC 设计模式
- kill -9 导致 Kakfa 重启失败的惨痛经历!
- 图解 DataX 核心设计原理