OpenSSL 与 C++ 搭建一个支持 TLS 1.3 的服务器

好的,我们可以使用 OpenSSL 与 C++ 搭建一个支持 TLS 1.3 的服务器。下面是:


✅ 一、完整示例代码(基于 OpenSSL)

使用 C++ 和 OpenSSL 创建一个简单的 TCP TLS 服务器,支持 TLS 1.3。

✅ 代码:tls_server.cpp

cpp 复制代码
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>

#define PORT 4433

void init_openssl() {
    SSL_load_error_strings();
    OpenSSL_add_ssl_algorithms();
}

void cleanup_openssl() {
    EVP_cleanup();
}

SSL_CTX* create_context() {
    // 1️⃣ 明确使用 TLS 服务器方法(会自动支持 TLS 1.3)
    const SSL_METHOD* method = TLS_server_method();
    SSL_CTX* ctx = SSL_CTX_new(method);

    if (!ctx) {
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }

    // 2️⃣ 可选:强制只允许 TLS 1.3(如果不加,OpenSSL 会使用 TLS1.2+)
    SSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION);
    SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION);

    return ctx;
}

void configure_context(SSL_CTX* ctx) {
    // 加载证书和私钥
    if (SSL_CTX_use_certificate_file(ctx, "cert.pem", SSL_FILETYPE_PEM) <= 0 ||
        SSL_CTX_use_PrivateKey_file(ctx, "key.pem", SSL_FILETYPE_PEM) <= 0) {
        ERR_print_errors_fp(stderr);
        exit(EXIT_FAILURE);
    }
}

int main() {
    init_openssl();
    SSL_CTX* ctx = create_context();
    configure_context(ctx);

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr = INADDR_ANY;

    bind(sock, (struct sockaddr*)&addr, sizeof(addr));
    listen(sock, 1);

    std::cout << "TLS server listening on port " << PORT << std::endl;

    while (1) {
        struct sockaddr_in client_addr;
        uint32_t len = sizeof(client_addr);
        int client = accept(sock, (struct sockaddr*)&client_addr, &len);

        SSL* ssl = SSL_new(ctx);
        SSL_set_fd(ssl, client);

        if (SSL_accept(ssl) <= 0) {
            ERR_print_errors_fp(stderr);
        } else {
            const char reply[] = "Hello over TLS 1.3!\n";
            SSL_write(ssl, reply, strlen(reply));
        }

        SSL_shutdown(ssl);
        SSL_free(ssl);
        close(client);
    }

    close(sock);
    SSL_CTX_free(ctx);
    cleanup_openssl();
    return 0;
}

📌 二、在哪里决定是否支持 TLS 1.3?

关键代码如下:

cpp 复制代码
// 决定允许的最小和最大 TLS 版本
SSL_CTX_set_min_proto_version(ctx, TLS1_3_VERSION);
SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION);

这两行代码强制只使用 TLS 1.3

如果你想支持多个版本(比如 TLS 1.2 和 1.3),可以改成:

cpp 复制代码
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION);

✅ 三、编译方法

你需要先安装 OpenSSL 开发库(通常是 libssl-dev):

bash 复制代码
sudo apt-get install libssl-dev

然后使用 g++ 编译:

bash 复制代码
g++ tls_server.cpp -o tls_server -lssl -lcrypto

✅ 四、测试方法

你可以使用 openssl s_client 模拟客户端:

bash 复制代码
openssl s_client -connect localhost:4433 -tls1_3

如果一切正常,会看到握手成功并打印证书信息。


如果你需要支持多客户端或使用异步 IO(如 epoll),可以进一步封装;这个示例是最小可运行 TLS 1.3 服务器。如果你想部署到生产,建议使用更安全的证书管理和错误处理机制。

是否需要我给你生成 cert.pemkey.pem 的命令?

相关推荐
慕木沐3 分钟前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python
Roann_seo%8 分钟前
C++文件操作完全指南:从文本读写到二进制文件处理
开发语言·c++
坚果派·白晓明1 小时前
【鸿蒙PC】SDL3 适配:AtomCode + Skills 快速集成 NAPI 测试工具
c++·华为·ai编程·harmonyos·atomcode
huangdong_1 小时前
淘宝商品SKU图自动分类技术深度解析:从DOM解析到智能归档
开发语言·javascript·ecmascript
阿正的梦工坊1 小时前
【Rust】12-借用检查器与非词法生命周期
开发语言·后端·rust
qq_2518364571 小时前
基于java Web网络订餐系统设计与实现 源码文档
java·开发语言·前端
秋92 小时前
3年经验Python后端转AI Engineer:3个月实战转型计划(2026版)
开发语言·人工智能·python
凡人叶枫2 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
飞天狗1112 小时前
零基础JavaWeb入门——第2课:让网页“活”起来 —— JSP是什么?
java·开发语言·前端·后端·web
醇氧3 小时前
【Linux】Java 服务生产级部署指南:实现常驻后台、开机自启与系统服务化管理
java·开发语言