openssl3.2 - 官方demo学习 - server-conf.c

文章目录

    • openssl3.2 - 官方demo学习 - server-conf.c
    • 概述
    • 笔记
    • END

openssl3.2 - 官方demo学习 - server-conf.c

概述

建立TLS服务器, 参数从配置文件中来.通过SSL_CONF_CTX_set_flags()来决定读那些TLS参数
遍历配置文件, 通过SSL_CONF_cmd()来读取预期的配置项.
如果不是TLS直接用的参数(e.g. BIO), 自己从配置文件Item中赋值到变量.

笔记

/*!
\file server-conf.c
\brief 建立TLS服务器, 参数从配置文件中来.通过SSL_CONF_CTX_set_flags()来决定读那些TLS参数遍历配置文件, 通过SSL_CONF_cmd()来读取预期的配置项. 如果不是TLS直接用的参数(e.g. BIO), 自己从配置文件Item中赋值到变量.
*//** Copyright 2013-2017 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the Apache License 2.0 (the "License").  You may not use* this file except in compliance with the License.  You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*//** A minimal program to serve an SSL connection. It uses blocking. It uses* the SSL_CONF API with a configuration file. cc -I../../include saccept.c* -L../.. -lssl -lcrypto -ldl*/#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <openssl/conf.h>#include "my_openSSL_lib.h"int main(int argc, char *argv[])
{char *psz_port = "*:4433";BIO *bio_in = NULL;BIO *bio_ssl, *bio_tmp;SSL_CTX *ctx_ssl;SSL_CONF_CTX *ctx_ssl_cfg = NULL;CONF *conf = NULL;STACK_OF(CONF_VALUE) *sk_of_conf_value = NULL;CONF_VALUE *conf_value;long errline = -1;char buf[512];int ret = EXIT_FAILURE, i;int iCfgItemCnt = 0;ctx_ssl = SSL_CTX_new(TLS_server_method());conf = NCONF_new(NULL);if (NCONF_load(conf, "accept.cnf", &errline) <= 0) {if (errline <= 0)fprintf(stderr, "Error processing config file\n");elsefprintf(stderr, "Error on line %ld\n", errline);goto err;}sk_of_conf_value = NCONF_get_section(conf, "default");if (sk_of_conf_value == NULL) {fprintf(stderr, "Error retrieving default section\n");goto err;}ctx_ssl_cfg = SSL_CONF_CTX_new();// 如果需要SSL_CONF_cmd处理的配置项, 先设置标志, 告诉 SSL_CONF_cmd需要从配置文件中读什么预想的配置项名称SSL_CONF_CTX_set_flags(ctx_ssl_cfg, SSL_CONF_FLAG_SERVER);SSL_CONF_CTX_set_flags(ctx_ssl_cfg, SSL_CONF_FLAG_CERTIFICATE);SSL_CONF_CTX_set_flags(ctx_ssl_cfg, SSL_CONF_FLAG_FILE);SSL_CONF_CTX_set_ssl_ctx(ctx_ssl_cfg, ctx_ssl);iCfgItemCnt = sk_CONF_VALUE_num(sk_of_conf_value);for (i = 0; i < iCfgItemCnt; i++) {int rv;conf_value = sk_CONF_VALUE_value(sk_of_conf_value, i);rv = SSL_CONF_cmd(ctx_ssl_cfg, conf_value->name, conf_value->value);if (rv > 0){/*! 如果是SSL配置项中指定的配置, 就会处理为true */continue;}/*! 如果是非法的配置项名称, 就会报错 */if (rv != -2) {fprintf(stderr, "Error processing %s = %s\n",conf_value->name, conf_value->value);ERR_print_errors_fp(stderr);goto err;}/*! 如果是合法的配置名称, 又不是SSL配置中需要的项目, 需要自己单独处理 */if (strcmp(conf_value->name, "Port") == 0) {psz_port = conf_value->value;} else {fprintf(stderr, "Unknown configuration option %s\n", conf_value->name);/*! 如果不是预想的配置名称, 需要继续遍历(多行时, 预想的配置项可能没写在第一行), 而不是报错退出 */// goto err;}}if (!SSL_CONF_CTX_finish(ctx_ssl_cfg)) {fprintf(stderr, "Finish error\n");ERR_print_errors_fp(stderr);goto err;}/* Setup server side SSL bio */bio_ssl = BIO_new_ssl(ctx_ssl, 0);if ((bio_in = BIO_new_accept(psz_port)) == NULL)goto err;/** This means that when a new connection is accepted on 'in', The ssl_bio* will be 'duplicated' and have the new socket BIO push into it.* Basically it means the SSL BIO will be automatically setup*/BIO_set_accept_bios(bio_in, bio_ssl);again:/** The first call will setup the accept socket, and the second will get a* socket.  In this loop, the first actual accept will occur in the* BIO_read() function.*/if (BIO_do_accept(bio_in) <= 0)goto err;for (;;) {i = BIO_read(bio_in, buf, 512); /*! 阻塞等待客户端来连接 */if (i == 0) {/** If we have finished, remove the underlying BIO stack so the* next time we call any function for this BIO, it will attempt* to do an accept*/printf("Done\n");bio_tmp = BIO_pop(bio_in);BIO_free_all(bio_tmp);goto again;}if (i < 0) {if (BIO_should_retry(bio_in))continue;goto err;}fwrite(buf, 1, i, stdout);fflush(stdout);}ret = EXIT_SUCCESS;err:if (ret != EXIT_SUCCESS)ERR_print_errors_fp(stderr);BIO_free(bio_in);return ret;
}

END

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

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

相关文章

第 379 场 LeetCode 周赛题解

A 对角线最长的矩形的面积 模拟 class Solution { public:int areaOfMaxDiagonal(vector<vector<int>> &dimensions) {int res 0, len2 0;for (auto &x: dimensions)if (x[0] * x[0] x[1] * x[1] > len2 || x[0] * x[0] x[1] * x[1] len2 &&am…

SAP 如何快速查询成本的异常

每当月末CO月结的时候&#xff0c;生产企业或多或少会遇到标准成本与实际成本差异偏大的情况&#xff0c;我们如何快速查看产成品的成本异常&#xff0c;一般来说二者偏差5%是正常的&#xff0c;如果偏差20%&#xff0c;就要重点关注。我们通过0062报表来查看 进入“屏幕选择”…

C语言之函数的递归

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //最简单的递归 int main() { printf("hehe\n"); main(); return 0; } //练习1&#xff1a;接受一个整型值&#xff0c;按顺序打印它的每一位 //例如&#xff1a;输入1234 输出 1 2 3 4 #…

进销存+小程序商城:实现批发零售企业的互联网转型与管理升级

在当今互联网高速发展的时代&#xff0c;越来越多的批发零售企业开始开始考虑转型。在这个行业中&#xff0c;企业要想取得更好的发展&#xff0c;就要积极地拥抱互联网。专属的订货商城小程序是企业转型的第一步。通过将进销存与订货商城一体化&#xff0c;企业可以更好地满足…

argparse库

引言 argparse-------python用于解析命令行参数的标准模块 快速上手 import argparse parser argparse.ArgumentParser() 创建一个命令行解析器对象 parser.add_argument() 向解析器…

C语言—存储管理

在C语言中&#xff0c;存储管理是指分配、使用和释放内存的过程。C提供了几个标准库函数来处理动态内存分配&#xff0c;这对于创建灵活且高效的程序至关重要。理解C语言的存储管理主要涉及以下几个方面&#xff1a; 1. 动态内存分配函数 malloc(size_t size) 分配指定大小的…

APP流量变现——4项关键指标决定了APP混合变现的收入

APP流量变现的方式有很多种&#xff0c;主要的可以分为IAA&#xff08;广告&#xff09;收入、IAP&#xff08;用户应用内付费&#xff09;收入、订阅收入、单次买断收入。这里主要围绕当前流行的混合变现模式&#xff0c;即广告收入&#xff08;IAA&#xff09;应用内付费&…

外汇天眼:塞浦路斯证券交易委员会(CySEC)确认了四家投资公司退出投资者赔偿基金(ICF)会员资格

塞浦路斯证券交易委员会&#xff08;CySEC&#xff09;今天确认了四家投资公司已被取消其在投资者赔偿基金&#xff08;ICF&#xff09;的会员资格。 以下公司不再是ICF的会员&#xff1a; 1.Stone Edge Capital Ltd&#xff08;LEI 213800PZFB9VV8FNWB30&#xff09;&#xf…

yum来安装php727

yum 安装php727,一键安装&#xff0c;都是安装在系统的默认位置&#xff0c;方便快捷 先确定linux平台中centos的版本信息&#xff0c;一下内容针对el7 查看linux版本 &#xff1a; cat /etc/redhat-release 查看内核版本命令&#xff1a; cat /proc/version (0)如果有安装好…

Hive中的四种排序

1.order by 全局排序&#xff0c;只有一个Reducer&#xff08;多个reducer无法保证全局有序&#xff09;&#xff0c;会导致当输入规模较大时&#xff0c;消耗较长的计算时间 hive.mapred.mode strict 模式下 必须指定 limit 否则执行会报错。 2.sort by 不是全局排序&…

3万字数据结构与算法学习笔记+知识点总结

文章目录 数据结构与算法排序排序算法常见排序算法复杂度冒泡排序&#xff08;Bubble Sort&#xff09;选择排序&#xff08;Selection Sort&#xff09;插入排序&#xff08;Insertion Sort&#xff09;希尔排序&#xff08;Shell Sort&#xff09;堆排序&#xff08;Heap Sor…

2024上海国际冶金及材料分析测试仪器设备展览会

2024上海国际冶金及材料分析测试仪器设备展览会 时间&#xff1a;2024年12月18&#xff5e;20日 地点&#xff1a;上海新国际博览中心 ◆ 》》》组织机构&#xff1a; 主办单位&#xff1a;全联冶金商会、中国宝武钢铁集团有限公司、上海市金属学会 支持单位&#xff…

Linux C语言 51-IO复用

Linux C语言 51-IO复用 本节关键字&#xff1a;Linux C语言 IO复用 相关C库函数&#xff1a;select&#xff08;FD_SET,FD_ISSET&#xff09;、epoll IO复用 epoll是Linux特有的。select是POSIX规定&#xff0c;一般操作系统均有实现。 名称支持进程打开最大连接数IO效率消…

浅谈电能管理系统在智能轨道交通中的设计与应用——安科瑞 顾烊宇

摘要&#xff1a;城市轨道交通可以填补市民出行方式的空缺&#xff0c;它的运行需要有持续的电能提供支持。为了给轨道交通营造稳定的运行环境&#xff0c;迫切需要建立相应的电能管理系统&#xff0c;以此实现高质量的电能供给。在本文中&#xff0c;将对应的电能管理系统作为…

MysqL——深入MySQL原理(一)

文章目录 MySQL架构图MySQL执行流程简要执行流程&#xff1a;详细执行流程 存储引擎SQL执行顺序存储结构实战演示 MySQL架构图 图例如下&#xff1a; server层&#xff1a; Connection Pool :连接池&#xff0c;负责管理持有所有的连接&#xff0c;采用BIO的技术&#xff0c;…

前端使用scale属性结合CSS动态样式实现动态的图片缩放效果

废话不多说&#xff0c;直接上代码&#xff1a; 示例一&#xff0c;使用css动态样式结合scale进行src图片的缩放。 //结构层&#xff0c;使用动态属性配合计算属性来实现动态样式<img :src"selectedItem.url" alt"" :style"elementStyle(item)&…

Android实现通过字符串找到图片、Class

1、通过字符串找到相应图片并展示 ApplicationInfo appInfo getActivity().getApplicationInfo();int resID getResources().getIdentifier("图片名字", "mipmap", appInfo.packageName);holder.setImageResource(R.id.title_img, resID);2、通过字符串找…

HttpURLConnection请求调用webservice接口

/*** sendUrl:接口地址&#xff1b;soapXML&#xff1a;要发送的xml数据&#xff08;入参&#xff0c;命名空间&#xff09;* */public static String send(String sendUrl, String soapXML) throws IOException {// 创建服务地址URL url new URL(sendUrl);// 打开一个通向服务…

nvm安装pnpm,pnpm不是内部或者外部指令问题解决

node版本18支持安装pnpm 如需要安装pnpm&#xff0c;要先安装nvm切换node版本&#xff0c;因为pnpm要node版本18 https://github.com/nvm-sh/nvm nvm install 18 nvm use 18如遇版本切换失败问题&#xff1a; source ~/bashrc然后安装pnpm curl -fsSL https://get.pnpm.io/…

golang学习-结构体

1、定义 使用type 和struct 关键字来定义结构体&#xff0c;是值类型 格式如下&#xff1a; type 类型名 struct { 字段名 类型 字段名 类型 ... } 2、实例化 1、var 结构体实例 结构体类型 var p1 Person 2、使用new关键字 var p2 new(Person) 3、使用&对结构体…