温馨提示×

Linux C++配置SSL如何操作

小樊
34
2026-09-11 00:56:40
栏目: 云计算

在 Linux 下用 C++ 配置和使用 SSL/TLS,通常是通过 OpenSSL 库来实现。下面从「环境准备 → 基本流程 → 服务端/客户端示例 → 常见问题」一步步说明。


一、环境准备(Linux)

1. 安装 OpenSSL

# Debian / Ubuntu
sudo apt update
sudo apt install libssl-dev

# CentOS / Rocky / Alma
sudo yum install openssl-devel

验证:

openssl version

2. 编译时链接 OpenSSL

g++ ssl_server.cpp -o ssl_server -lssl -lcrypto

二、SSL 基本流程(核心概念)

SSL/TLS 在 TCP 之上:

TCP Socket → SSL_CTX → SSL → 读写数据

主要步骤:

  1. 初始化 OpenSSL
  2. 创建 SSL_CTX
  3. 加载证书和私钥
  4. 绑定 TCP socket
  5. 建立 SSL 连接
  6. 使用 SSL_read / SSL_write
  7. 释放资源

三、服务端 SSL 示例(C++)

1. 生成自签名证书(测试用)

openssl genrsa -out server.key 2048
openssl req -new -x509 -key server.key -out server.crt -days 365

2. 服务端代码(简化版)

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

四、客户端 SSL 示例

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

五、证书验证(生产环境重要)

服务端

  • 使用 CA 签发的证书
  • 禁用不安全的协议:
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);

六、常见问题

1. SSL_connect 失败

  • 证书不匹配
  • 时间不对
  • 未加载 CA

2. 协议版本不兼容

  • 新 OpenSSL 默认禁用 TLS 1.0 / 1.1

3. 多线程

  • 使用 CRYPTO_num_locks + CRYPTO_set_locking_callback(老版本)
  • OpenSSL 1.1+ 已线程安全

七、推荐方案(现代 C++)


如果你需要:

  • 完整可运行 demo
  • 双向认证(mTLS)
  • 非阻塞 / epoll + SSL
  • Qt / Boost 示例

告诉我你的使用场景即可。

0