将简单套接字转换为 SSL 套接字

2024-10-23 08:47:00
admin
原创
201
摘要:问题描述:我编写了简单的 C 程序,使用套接字(“客户端”和“服务器”)。(UNIX/Linux 使用)服务器端只需创建一个套接字:sockfd = socket(AF_INET, SOCK_STREAM, 0); 然后将其绑定到 sockaddr:bind(sockfd, (struct sockaddr ...

问题描述:

我编写了简单的 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添加到我的项目中,但找不到简单的方法来实现我想要的功能。


解决方案 1:

使用 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
", 6);

更新
使用SSL_CTX_new最适合您需求的 TLS 方法调用,以支持较新版本的安全性,而不是SSLv23_server_method()。请参阅:
OpenSSL SSL_CTX_new 说明

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

解决方案 2:

OpenSSL 相当难用。如果协商不准确,很容易意外地丢掉所有安全。(哎呀,我本人就遇到过一个 bug,curl 无法准确读取 OpenSSL 警报,无法与某些网站通信。)

如果您真的想要快速而简单,请将stud放在程序前面,然后就结束了。将 SSL 放在不同的进程中不会减慢您的速度:http ://vincent.bernat.im/en/blog/2011-ssl-benchmark.html

解决方案 3:

对于像我这样的人来说:

目录中的 SSL 源代码中曾经有一个示例demos/ssl/,其中包含 C++ 示例代码。现在只能通过历史记录获取:
https ://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/ssl

您可能必须找到一个可用的版本,我最初于 2015 年 11 月 6 日发布了这个答案。并且我必须编辑源代码 - 没什么。

证书:.pem 位于demos/certs/apps/: https: //github.com/openssl/openssl/tree/master/demos/certs/apps

解决方案 4:

就像您看到的一样,这非常棘手。但“简单”的部分是,在您使用 OpenSSL 设置 SSL/TLS 会话后,您在 HTTPS 套接字上读取/写入所遵循的模式与您在 HTTP 上遵循的模式相同。

不同之处在于您使用的是SSL_read/SSL_write函数,而不是read/write函数。SSL_read/SSL_write函数将SSL指针而不是文件描述符作为其第一个参数。

无论如何,这是一个适用于 Unix 环境的完整 OpenSSL 示例,其中包含编译/运行说明、APT 依赖项和参考。这只是一些可供您磨练的实用代码。

成功编译后,您将看到一条关于已弃用的 OpenSSL 函数的警告。

成功运行后,您将看到 example.com 的 TLS 证书主题打印到标准输出,然后是 example.com 的 HTML 内容。

https://github.com/angstyloop/c-web/blob/main/openssl-fetch-example.c

在 Ubuntu 22.04 上测试。

解决方案 5:

这是我的示例 ssl 套接字服务器线程(多个连接)https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <iostream>

#include <breakermindsslserver.h>

using namespace std;

int main(int argc, char *argv[])
{
    BreakermindSslServer boom;
    boom.Start(123,"/home/user/c++/qt/BreakermindServer/certificate.crt", "/home/user/c++/qt/BreakermindServer/private.key");
    return 0;
}
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用