买业务送网站/全网营销推广方案

买业务送网站,全网营销推广方案,贵安新区建设管理信息网站,国外设计素材网站理解 OpenSSL 的基础使用流程是学习如何进行安全通信的关键,特别是在实现 SSL/TLS 连接时。以下是 OpenSSL 基础使用流程的一个简要总结,并附上一个简单的示例代码,帮助你理解如何通过 OpenSSL 建立一个基本的安全通信连接。 OpenSSL 基础使…

理解 OpenSSL 的基础使用流程是学习如何进行安全通信的关键,特别是在实现 SSL/TLS 连接时。以下是 OpenSSL 基础使用流程的一个简要总结,并附上一个简单的示例代码,帮助你理解如何通过 OpenSSL 建立一个基本的安全通信连接。

OpenSSL 基础使用流程

  1. 初始化 OpenSSL
    在使用 OpenSSL 之前,你需要先初始化 OpenSSL 库。这个初始化过程会加载加密算法、SSL 库等所需的组件。

  2. 创建 SSL 上下文 (SSL_CTX)
    SSL_CTX 是管理 SSL 连接的上下文对象,类似于一个配置容器,它包含了 SSL 连接所需的所有参数和设置。

  3. 创建 SSL 对象 (SSL)
    SSL 对象表示一个具体的 SSL 连接,它用于与客户端或服务器进行加密通信。

  4. 设置证书和私钥
    对于服务器来说,你需要提供证书和私钥。这些信息用于加密和验证数据传输的安全性。

  5. 建立连接
    在建立 TCP 连接之后,SSL 连接会在这个 TCP 连接的基础上进行握手、加密数据交换等操作。

  6. 进行 SSL/TLS 握手
    握手是建立安全连接的过程,客户端和服务器通过此过程协商加密算法、交换密钥等。

  7. 读写加密数据
    通过 SSL_read()SSL_write() 函数,你可以在加密的 SSL/TLS 连接上进行安全的数据读写。

  8. 关闭连接
    使用完毕后,记得关闭 SSL 连接并释放资源。


示例代码

以下是一个简单的 OpenSSL 客户端和服务器的代码示例,展示了如何使用 OpenSSL 创建一个基本的 SSL/TLS 连接。

1. 客户端代码示例
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/rand.h>
#include <openssl/x509.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define SERVER_PORT 4433
#define SERVER_IP "127.0.0.1"int main() {// 初始化 OpenSSLSSL_library_init();SSL_load_error_strings();OpenSSL_add_all_algorithms();// 创建 SSL 上下文SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());if (!ctx) {std::cerr << "Error creating SSL_CTX" << std::endl;return -1;}// 创建 SSL 对象SSL *ssl = SSL_new(ctx);// 创建 socket 并连接到服务器int sock = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Error connecting to server" << std::endl;return -1;}// 将 socket 与 SSL 对象关联SSL_set_fd(ssl, sock);// SSL 握手if (SSL_connect(ssl) <= 0) {std::cerr << "SSL connect failed" << std::endl;return -1;}std::cout << "SSL Connection established!" << std::endl;// 发送数据const char *msg = "Hello, secure world!";if (SSL_write(ssl, msg, strlen(msg)) <= 0) {std::cerr << "Error writing to SSL" << std::endl;}// 接收数据char buffer[1024];int bytes = SSL_read(ssl, buffer, sizeof(buffer)-1);if (bytes > 0) {buffer[bytes] = 0;std::cout << "Received: " << buffer << std::endl;}// 关闭 SSL 连接SSL_shutdown(ssl);close(sock);// 清理资源SSL_free(ssl);SSL_CTX_free(ctx);return 0;
}
2. 服务器代码示例
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
#include <netinet/in.h>
#include <sys/socket.h>#define SERVER_PORT 4433int main() {// 初始化 OpenSSLSSL_library_init();SSL_load_error_strings();OpenSSL_add_all_algorithms();// 创建 SSL 上下文SSL_CTX *ctx = SSL_CTX_new(TLS_server_method());if (!ctx) {std::cerr << "Error creating SSL_CTX" << std::endl;return -1;}// 加载证书和私钥if (SSL_CTX_use_certificate_file(ctx, "server_cert.pem", SSL_FILETYPE_PEM) <= 0 ||SSL_CTX_use_PrivateKey_file(ctx, "server_key.pem", SSL_FILETYPE_PEM) <= 0) {std::cerr << "Error loading certificate or private key" << std::endl;return -1;}// 创建 socket 并绑定到指定端口int server_sock = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = INADDR_ANY;if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {std::cerr << "Error binding server socket" << std::endl;return -1;}// 监听连接if (listen(server_sock, 1) < 0) {std::cerr << "Error listening on socket" << std::endl;return -1;}std::cout << "Waiting for a client to connect..." << std::endl;int client_sock = accept(server_sock, NULL, NULL);if (client_sock < 0) {std::cerr << "Error accepting connection" << std::endl;return -1;}// 创建 SSL 对象SSL *ssl = SSL_new(ctx);// 将 socket 与 SSL 对象关联SSL_set_fd(ssl, client_sock);// SSL 握手if (SSL_accept(ssl) <= 0) {std::cerr << "SSL accept failed" << std::endl;return -1;}std::cout << "SSL Connection established!" << std::endl;// 接收数据char buffer[1024];int bytes = SSL_read(ssl, buffer, sizeof(buffer)-1);if (bytes > 0) {buffer[bytes] = 0;std::cout << "Received: " << buffer << std::endl;}// 发送数据const char *msg = "Hello, secure client!";if (SSL_write(ssl, msg, strlen(msg)) <= 0) {std::cerr << "Error writing to SSL" << std::endl;}// 关闭 SSL 连接SSL_shutdown(ssl);close(client_sock);close(server_sock);// 清理资源SSL_free(ssl);SSL_CTX_free(ctx);return 0;
}

重点概念解析

  1. SSL_CTX(SSL 上下文)
    SSL_CTX 是配置 SSL/TLS 连接所需的所有参数和设置的容器,它在整个连接生命周期中被共享。

  2. SSL 对象
    每个 SSL/TLS 连接都有一个 SSL 对象,它包含了具体的 SSL 连接信息,包括连接的协议版本、加密算法等。

  3. 证书和私钥的加载
    对于 SSL 服务器,必须加载证书和私钥,这些用于加密和解密数据流。

  4. SSL 握手
    握手阶段用于协商加密算法和生成共享密钥,确保客户端和服务器可以安全地交换数据。

  5. 数据的加密和解密
    使用 SSL_write()SSL_read() 对数据进行加密和解密,保证数据的安全性。

  6. 错误处理
    OpenSSL 提供了丰富的错误信息,使用 SSL_get_error()ERR_get_error() 获取错误详细信息,帮助调试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/72301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是最终一致性,它对后端系统的意义是什么

最终一致性(Eventual Consistency)是分布式系统中的一种一致性模型。与传统的强一致性模型不同,最终一致性并不要求系统在任何时刻都保持一致,而是保证在足够的时间后,所有节点的数据最终会达到一致的状态。换句话说,系统允许短时间内出现数据的不一致性,但最终会通过某…

SQL命令详解之增删改数据

目录 简介 1 添加数据 1.1 基础语法 1.2 SQL 练习 2 修改数据 2.1 基础语法 2.2 SQL 练习 ​3 删除数据 3.1 基础语法 3.2 SQL 练习 总结 简介 在数据库操作中&#xff0c;增、删、改是最基础的操作&#xff0c;它们通常对应着SQL中的INSERT、DELETE和UPDATE命令。…

QT——c++界面编程库

非界面编程 QT编译的时候&#xff0c;依赖于 .pro 配置文件&#xff1a; SOURCES: 所有需要参与编译的 .cpp 源文件 HEADERS:所有需要参与编译的.h 头文件 QT&#xff1a;所有需要参与编译的 QT函数库 .pro文件一旦修改&#xff0c;注意需要键盘按 ctrls 才能加载最新的配置文…

基于专利合作地址匹配的数据构建区域协同矩阵

文章目录 地区地址提取完成的处理代码 在专利合作申请表中&#xff0c;有多家公司合作申请。在专利权人地址中&#xff0c; 有多个公司的地址信息。故想利用这里多个地址。想用这里的地址来代表区域之间的专利合作情况代表区域之间的协同、协作情况。 下图是专利合作表的一部分…

汽车小助手智能体

汽车小助手&#xff1a;智能驱动汽车服务新体验 链接&#xff1a;文心智能体平台AgentBuilder | 想象即现实 文心智能体平台AgentBuilder&#xff0c;是百度推出的基于文心大模型的智能体平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类型的…

VSCode轻松调试运行.Net 8.0 Web API项目

1.背景 我一直都是用VS来开发.NetCore项目的&#xff0c;用的比较顺手&#xff0c;也习惯了。看其他技术文章有介绍VS Code更轻量&#xff0c;更方便。所以我专门花时间来使用VS Code&#xff0c;看看它是如何调试代码、如何运行.Net 8.0 WebAPI项目。这篇文章是一个记录的过程…

P8720 [蓝桥杯 2020 省 B2] 平面切分--set、pair

P8720 [蓝桥杯 2020 省 B2] 平面切分--set、pair 题目 分析一、pair1.1pair与vector的区别1.2 两者使用场景两者组合使用 二、set2.1核心特点2.2set的基本操作2.3 set vs unordered_set示例&#xff1a;统计唯一单词数代码 题目 分析 大佬写的很明白&#xff0c;看这儿 我讲讲…

游戏引擎学习第128天

开始 然而&#xff0c;我们仍然有一些工作要做&#xff0c;渲染部分并没有完全完成。虽然现在已经能够运行游戏&#xff0c;而且帧率已经可以接受&#xff0c;但仍然有一些东西需要进一步完善。正在使用调试构建编译版本&#xff0c;虽然调试版本的性能不如优化版本&#xff0…

多元数据直观表示(R语言)

一、实验目的&#xff1a; 通过上机试验&#xff0c;掌握R语言实施数据预处理及简单统计分析中的一些基本运算技巧与分析方法&#xff0c;进一步加深对R语言简单统计分析与图形展示的理解。 数据&#xff1a; 链接: https://pan.baidu.com/s/1kMdUWXuGCfZC06lklO5iXA 提取码: …

Hadoop之02:MapReduce编程模型

MapReduce编程模型 理解MapReduce编程模型独立完成一个MapReduce程序并运行成功了解MapReduce工程流程掌握并描述出shuffle全过程&#xff08;面试&#xff09;独立编写课堂及作业中的MR程序理解并解决数据倾斜 1. MapReduce编程模型 Hadoop架构图 Hadoop由HDFS分布式存储、M…

mapbox基础,使用geojson加载heatmap热力图层

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️heatmap热力图层样式二、🍀使用geojs…

在2023idea中如何创建SpringBoot

目录 一.下载和安装 Maven 1.前往 https://maven.apache.org/download.cgi 下载最新版的 Maven 程序 2.将文件解压到D:Program FilesApachemaven目录 3.新建环境变量MAVEN_HOME&#xff0c;赋值D:Program FilesApachemaven 4.编辑环境变量Path&#xff0c;追加%MAVEN_HOME…

基于YOLO11深度学习的遥感视角农田检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

用冒泡排序法模拟qsort函数

目录 1.前言 2.qsort函数的介绍 ​3.冒泡法回顾 4.模拟qsort---buble_sort 4.1 buble_sort格式 4.2 主函数&#xff0c;以int类型为例 4.3comp_int函数的功能设计 4.4 swap函数的功能设计 5. 总代码概览 1.前言 今天&#xff0c;小邓儿带大家用冒泡排序法来模拟一下qs…

全星研发项目管理APQP软件系统:铸造芯片集成电路产业研发体系化建设平台

全星研发项目管理APQP软件系统&#xff1a;铸造芯片集成电路产业研发体系化建设平台 在芯片集成电路行业&#xff0c;研发效率和质量直接决定了企业的核心竞争力。面对日益复杂的芯片设计、日益缩短的产品生命周期以及日益严格的质量要求&#xff0c;传统的研发管理模式已难以满…

《Python实战进阶》No 11:微服务架构设计与 Python 实现

第11集&#xff1a;微服务架构设计与 Python 实现 2025年3月3日更新了代码和微服务运行后的系统返回信息截图&#xff0c;所有代码在 python3.11.5虚拟环境下运行通过。 微服务架构通过将复杂应用拆分为独立部署的小型服务&#xff0c;显著提升了系统的可扩展性和维护性。本集…

USRP7440-通用软件无线电平台

1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构&#xff0c;它将射频ADC、DAC、ARM、FPGA等集成一体&#xff0c;瞬时带宽可以达到2.5GHz&#xff0c;尤其适合于射频直采应用&#xff0c;比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…

1.2.3 使用Spring Initializr方式构建Spring Boot项目

本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目&#xff0c;并进行基本配置。首先&#xff0c;通过Spring Initializr生成项目骨架&#xff0c;然后创建控制器HelloController&#xff0c;定义处理GET请求的方法hello&#xff0c;返回HTML字符串。接着&#xf…

【小羊肖恩】小羊杯 Round 2 C+K

题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/100672#question C.是毛毛虫吗&#xff1f; 思路&#xff1a; 其实很简单&#xff0c;假设我们要满足题目所给条件&#xff0c;那么这个毛毛虫最坏情况下肯定是一条如下图所示的无向图 右端省略号为对称图形 &…

不同规模企业如何精准选择AI工具: DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具深度剖析与对比

本文深入探讨了最近国内外主流的 DeepSeek、Grok 和 ChatGPT 三款主流 AI 工具的技术细节、性能表现、应用场景及局限性&#xff0c;并从技术能力、功能需求、成本预算、数据安全和合规以及服务与支持五个关键维度&#xff0c;详细分析了不同规模企业在选择 AI 工具时的考量因素…