我编写了简单的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添加到我的项目中,但我找不到一种简单的方法来实现我想要的东西。
5条答案
按热度按时间dkqlctbz1#
使用OpenSSL时有几个步骤。你必须制作一个SSL证书,它可以包含带有私钥的证书,确保指定证书的确切位置(这个例子在根目录中)。有很多很好的教程。
其中包括:
您需要初始化OpenSSL:
现在来看看大部分的功能。你可能想在连接上添加一个while循环。
然后,您就可以使用以下命令进行读写:
更新应该使用最符合您需求的TLS方法来呼叫
SSL_CTX_new
,以支援较新版本的安全性,而非SSLv23_server_method()
。请参阅:OpenSSL SSL_CTX_new descriptionsmtd7mpg2#
OpenSSL是相当困难的。很容易因为没有正确地进行协商而意外地放弃所有的安全性。(见鬼,我个人被一个bug咬了一口,curl没有正确地阅读OpenSSL警报,并且不能与一些站点通信。)
如果你真的希望快速简单,那就把stud放在你的程序前面,然后就可以收工了。把SSL放在一个不同的进程中不会拖慢你的速度:http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
eimct9ow3#
对于像我这样的人:
在SSL源代码中,曾经有一个例子,它位于
demos/ssl/
目录中,其中包含C++代码示例。现在,它只能通过历史记录获得:https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/ssl你可能得找到一个工作版本,我最初是在2015年11月6日发布这个答案的。我不得不编辑源代码--不多。
证书:.在
demos/certs/apps/
中的PEM:https://github.com/openssl/openssl/tree/master/demos/certs/appsbwleehnv4#
就像你看到的那样,这是非常麻烦的。但是“简单”的部分是,在你用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上测试。
pzfprimi5#
下面是我的示例ssl套接字服务器线程(多连接)https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp