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

新手上路,请多包涵

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

原文由 David Mape 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
1 个回答

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

一些包括:

 #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);

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

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

原文由 CaptainBli 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题