将简单套接字变成 SSL 套接字

2023-11-23

我编写了简单的 C 程序,它们使用套接字(“客户端”和“服务器”)。 (UNIX/Linux 用法)

服务器端简单地创建一个套接字:

sockfd = socket(AF_INET, SOCK_STREAM, 0);

然后将其绑定到 sockaddr:

bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

并聆听(并接受和阅读):

listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);

客户端创建套接字,然后写入它。

现在,我想以最简单、最田园诗般、最简洁、最快的方式将这个简单的连接转换为 SSL 连接。

我尝试添加OpenSSL到我的项目,但我找不到一种简单的方法来实现我想要的。


使用 OpenSSL 时有几个步骤。您必须制作一个 SSL 证书,其中可以包含带有私钥的证书,请务必指定证书的确切位置(本示例将其放在根目录中)。那里有很多很好的教程。

  • HP 的一些文档和工具(请参阅第 2 章)
  • OpenSSL 的命令行

一些包括:

#include <openssl/applink.c>
#include <openssl/bio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

您需要初始化 OpenSSL:

void InitializeSSL()
{
    SSL_load_error_strings();
    SSL_library_init();
    OpenSSL_add_all_algorithms();
}

void DestroySSL()
{
    ERR_free_strings();
    EVP_cleanup();
}

void ShutdownSSL()
{
    SSL_shutdown(cSSL);
    SSL_free(cSSL);
}

现在介绍大部分功能。您可能想在连接上添加 while 循环。

int sockfd, newsockfd;
SSL_CTX *sslctx;
SSL *cSSL;

InitializeSSL();
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd< 0)
{
    //Log and Error
    return;
}
struct sockaddr_in saiServerAddress;
bzero((char *) &saiServerAddress, sizeof(saiServerAddress));
saiServerAddress.sin_family = AF_INET;
saiServerAddress.sin_addr.s_addr = serv_addr;
saiServerAddress.sin_port = htons(aPortNumber);

bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));

listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

sslctx = SSL_CTX_new( SSLv23_server_method());
SSL_CTX_set_options(sslctx, SSL_OP_SINGLE_DH_USE);
int use_cert = SSL_CTX_use_certificate_file(sslctx, "/serverCertificate.pem" , SSL_FILETYPE_PEM);

int use_prv = SSL_CTX_use_PrivateKey_file(sslctx, "/serverCertificate.pem", SSL_FILETYPE_PEM);

cSSL = SSL_new(sslctx);
SSL_set_fd(cSSL, newsockfd );
//Here is the SSL Accept portion.  Now all reads and writes must use SSL
ssl_err = SSL_accept(cSSL);
if(ssl_err <= 0)
{
    //Error occurred, log and close down ssl
    ShutdownSSL();
}

然后您可以使用以下方式读取或写入:

SSL_read(cSSL, (char *)charBuffer, nBytesToRead);
SSL_write(cSSL, "Hi :3\n", 6);

Update The SSL_CTX_new应使用最适合您需求的 TLS 方法进行调用,以支持较新版本的安全性,而不是SSLv23_server_method(). See: OpenSSL SSL_CTX_新描述

TLS_method()、TLS_server_method()、TLS_client_method()。这些是通用的版本灵活SSL/TLS 方法。实际使用的协议版本将协商为客户端和服务器共同支持的最高版本。支持的协议包括 SSLv3、TLSv1、TLSv1.1、TLSv1.2 和 TLSv1.3。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将简单套接字变成 SSL 套接字 的相关文章

  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • Android NDK C++“wstring”支持

    我有用 C 编写的源代码 lib 现在我想在 Android NDK 项目 NDK 6 中编译并使用相同的源代码 lib 我能够编译大多数 C 文件 除了基于 std wstring 的功能 在 Application mk 中 当我指定时
  • 使用不带参数的 Split() 时,默认分隔符是什么?

    所以我看了看String Split 今天 C 中的方法 我意识到你也可以向它传递零参数 这是我从未考虑过的 使用时默认的分隔符是什么Split 没有任何参数 如果没有值 则为空白 来源自here https msdn microsoft
  • javax.net.ssl.SSLException:没有可用的 PSK。无法恢复

    我正在使用 Jetty 客户端发送传出请求 在 Java 10 下完美运行的代码在 Java 11 下突然出现以下异常 javax net ssl SSLException No PSK available Unable to resume
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • .net Framework (.net 4.0) 中定义 Base 3 数字的类

    我正在寻找一些可以用来定义 3 基数 三进制数 的类 有什么我可以在 net 框架中使用的东西或者我需要写一些东西吗 谢谢你的帮助 您可以使用解析Convert ToInt32 s base http msdn microsoft com
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 正在获取“未终止 [] 设置”。 C# 中的错误

    我正在 C 中使用以下正则表达式 Regex find new Regex url
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows
  • 如何确定给定方法可以抛出哪些异常?

    我的问题和这个真的一样 找出 C 中方法可能抛出的异常 https stackoverflow com questions 264747 finding out what exceptions a method might throw in

随机推荐

  • Spring Boot 是否可以通过 JAR 打包来提供 JSP?

    我熟悉 Spring BootJSP 示例应用程序 然而该示例使用了WAR包装 是否可以做同样的事情
  • 引用 UWP 和 ASP.NET 5 中的类库

    我正在尝试创建一个类库 其中包含 WebAPI 使用 ASP NET 5 和消费 UWP 应用程序的常见对象 主要是 DTO 但是 我还没有弄清楚如何创建类库 以便可以从其他项目中引用它 到目前为止我已经尝试过 首先 我尝试了一个类库 包
  • 使用 axios.get 时套接字挂起,但使用 https.get 时套接字不挂起

    据我所知 我正在使用两种不同的方法做同样的事情 const https require https const axios require axios let httpsAgent new https Agent rejectUnautho
  • 如何在命名空间中使用连字符?

    我在用https packagist org packages bitdevelopment yii2 validators Yii2 中的字数验证 但我得到 gt PHP Parse Error yii base ErrorExcepti
  • 如何排除`node_modules/@types/**/node_modules`?

    我遇到过一种情况 其中的类型定义node modules types正在安装自己的 types 依赖项 并且这些 嵌套 types 与我的顶级 types 冲突 types angular v1 5 angular ui bootstrap
  • Lucene - 短语中的通配符

    我目前正在尝试使用 Lucene 来搜索索引中填充的数据 我可以通过将其括在括号中来匹配确切的短语 即 处理文档 但无法让 Lucene 通过执行任何类型的 处理文档 来找到该短语 明显的区别是末尾的通配符 我目前正在尝试使用 Luke 来
  • Perl:使用变量传递正则表达式搜索和替换

    我有一个 Perl 脚本 它读取正则表达式搜索并替换 INI 文件中的值 在我尝试使用捕获变量 1 或 1 之前 这工作正常 这些被逐字替换为 1 或 1 有什么想法可以让这个捕获功能通过变量传递正则表达式位吗 示例代码 不使用 ini 文
  • 在 Renderscript 计算中将数组传递给 rsForEach

    据我所知 我发现 RenderScript 缺乏良好的文档 forEachRS 中的方法是对分配中的每个单独项目执行 root 我正在尝试为 Renderscript 制作一个进行图像处理的库 作为起点 我达到了这个很好的答案 但问题是模糊
  • NSURLSession 和后台流上传

    我在使用时遇到一些问题NSURLSession将照片从资源库上传到服务器 首先NSURLSession不支持流式上传 我在尝试使用它时遇到了异常 property nonatomic strong NSURLSession uploadSe
  • 如何使用密钥大小和明文长度计算 RSA 密文的大小?

    我有一些明文 我想使用 RSA PKCS V21 使用 PolarSSL 库 进行加密 问题是我需要在执行算法之前知道密文的大小 用于动态内存分配目的 我知道 RSA 密钥大小和明文长度 我还想知道输入明文长度的限制 任何想法 只需检查RS
  • Unicode 与实体框架

    我有一个带有 nvarchar 字段的表 MS SQL Server 2008 R2 对于测试 此代码运行良好 Update Screenshots set name N where id 230246 现在我创建了实体框架模型 我已将 U
  • Elisp 中的 CGI 编程?

    有人为 elisp 编写过 CGI 编程库吗 我快速拼凑了第一个脚本 然而 我只是一个长期的 emacs 用户 我从来没有真正编写过它 当我看到我可以在 emacs 而不是 bash 中编写脚本 script 时 我想我应该尝试一下 usr
  • 如果用户提交表单,则不要询问确认

    我使用以下 JavaScript 代码来警告用户 如果他尝试重定向到另一个页面而不提交表单 window onbeforeunload function return Are you sure that you want to leave
  • servicePrincipalName 应该具有什么值?

    我正在尝试在我的服务上设置客户端模拟 我需要为我的服务端点的 servicePrincipalName 设置一个值 我正在看这个MSDN 文章但还是不太明白 我的服务托管在我们称为 ServerName1 的服务器上的控制台应用程序中 乌里
  • 类型的打字稿扩展运算符[重复]

    这个问题在这里已经有答案了 我正在尝试定义一种类型 该类型获取函数类型作为泛型参数 并返回一个与输入函数类型相同的函数类型 只是它最后还有一个参数 type AugmentParam
  • java.lang.NoClassDefFoundError:无法初始化类 sun.nio.ch.FileChannelImpl

    我正在开发一个执行的应用程序Jython 2 5 3脚本来自JAVA 1 6 027 该脚本只是使用编解码器库打开一个文件 如下所示 try from codecs import open as codecs open except Imp
  • 以正确的方式避免循环依赖 - NestJS

    说我有一个StudentService一种为学生增加课程的方法LessonService使用一种将学生添加到课程中的方法 在我的课程和学生解决程序中 我希望能够更新本课程学生关系 所以在我的LessonResolver我有一些类似的事情 a
  • 在 VS Code 控制台中调试 JavaScript

    如何在 VSCode 控制台中快速测试 JavaScript 如下图所示 我必须安装扩展才能执行此操作吗 我在 Ubuntu 和 Windows 10 中使用 VSCode 但我没有看到Console 我所看到的只是调试控制台 Proble
  • 这个带有可变引用参数的 JavaScript 函数是纯函数吗?

    我有同样的问题this one 但是在 JavaScript 的上下文中 From 维基百科 纯函数 的返回值与same论据 那里进一步声称 纯函数不允许使用 可变引用参数 来改变返回值 在 JavaScript 中 每个普通对象都作为 可
  • 将简单套接字变成 SSL 套接字

    我编写了简单的 C 程序 它们使用套接字 客户端 和 服务器 UNIX Linux 用法 服务器端简单地创建一个套接字 sockfd socket AF INET SOCK STREAM 0 然后将其绑定到 sockaddr bind so