在 Linux 下用 C++ 配置和使用 SSL/TLS,通常是通过 OpenSSL 库来实现。下面从「环境准备 → 基本流程 → 服务端/客户端示例 → 常见问题」一步步说明。
# Debian / Ubuntu
sudo apt update
sudo apt install libssl-dev
# CentOS / Rocky / Alma
sudo yum install openssl-devel
验证:
openssl version
g++ ssl_server.cpp -o ssl_server -lssl -lcrypto
SSL/TLS 在 TCP 之上:
TCP Socket → SSL_CTX → SSL → 读写数据
主要步骤:
SSL_CTXSSL_read / SSL_writeopenssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 365
#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
int main() {
SSL_load_error_strings();
OpenSSL_add_ssl_algorithms();
const SSL_METHOD* method = TLS_server_method();
SSL_CTX* ctx = SSL_CTX_new(method);
SSL_CTX_use_certificate_file(ctx, "server.crt", SSL_FILETYPE_PEM);
SSL_CTX_use_PrivateKey_file(ctx, "server.key", SSL_FILETYPE_PEM);
SSL_CTX_check_private_key(ctx);
int sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8443);
addr.sin_addr.s_addr = INADDR_ANY;
bind(sock, (sockaddr*)&addr, sizeof(addr));
listen(sock, 5);
int client = accept(sock, nullptr, nullptr);
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, client);
SSL_accept(ssl);
char buf[256];
SSL_read(ssl, buf, sizeof(buf));
std::cout << "Client: " << buf << std::endl;
SSL_write(ssl, "Hello from SSL server", 22);
SSL_shutdown(ssl);
SSL_free(ssl);
close(client);
SSL_CTX_free(ctx);
EVP_cleanup();
}
#include <iostream>
#include <arpa/inet.h>
#include <openssl/ssl.h>
int main() {
SSL_load_error_strings();
OpenSSL_add_ssl_algorithms();
SSL_CTX* ctx = SSL_CTX_new(TLS_client_method());
int sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8443);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
connect(sock, (sockaddr*)&addr, sizeof(addr));
SSL* ssl = SSL_new(ctx);
SSL_set_fd(ssl, sock);
SSL_connect(ssl);
SSL_write(ssl, "Hello SSL", 10);
char buf[256];
SSL_read(ssl, buf, sizeof(buf));
std::cout << "Server: " << buf << std::endl;
SSL_shutdown(ssl);
SSL_free(ssl);
close(sock);
SSL_CTX_free(ctx);
}
SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, nullptr);
SSL_CTX_load_verify_locations(ctx, "ca.crt", nullptr);
SSL_connect 失败CRYPTO_num_locks + CRYPTO_set_locking_callback(老版本)如果你需要:
告诉我你的使用场景即可。