好的,我们可以使用 OpenSSL 与 C++ 搭建一个支持 TLS 1.3 的服务器。下面是:
✅ 一、完整示例代码(基于 OpenSSL)
使用 C++ 和 OpenSSL 创建一个简单的 TCP TLS 服务器,支持 TLS 1.3。
✅ 代码:tls_server.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?
关键代码如下:
// 决定允许的最小和最大 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),可以改成:
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
SSL_CTX_set_max_proto_version(ctx, TLS1_3_VERSION);
✅ 三、编译方法
你需要先安装 OpenSSL 开发库(通常是 libssl-dev
):
sudo apt-get install libssl-dev
然后使用 g++ 编译:
g++ tls_server.cpp -o tls_server -lssl -lcrypto
✅ 四、测试方法
你可以使用 openssl s_client
模拟客户端:
openssl s_client -connect localhost:4433 -tls1_3
如果一切正常,会看到握手成功并打印证书信息。
如果你需要支持多客户端或使用异步 IO(如 epoll
),可以进一步封装;这个示例是最小可运行 TLS 1.3 服务器。如果你想部署到生产,建议使用更安全的证书管理和错误处理机制。
是否需要我给你生成 cert.pem
和 key.pem
的命令?