首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

OpenSSL 實現 SSL/TLS 客戶端與服務端通信完整示例

     編輯:關於C語言

基於 OpenSSL 的 SSL 加密通訊:服務端與客戶端完整實現

展示使用 OpenSSL 庫構建基於 TCP 的 SSL/TLS 加密通訊雙向示例,含證書生成、編譯、運行全流程。

服務端核心流程

  1. 初始化 SSL 庫:SSL_library_init(), OpenSSL_add_all_algorithms(), SSL_load_error_strings()
  2. 創建 SSL_CTX:SSL_CTX_new(SSLv23_server_method())
  3. 載入證書與私鑰:SSL_CTX_use_certificate_file(), SSL_CTX_use_PrivateKey_file(), SSL_CTX_check_private_key()
  4. Socket 監聽:socket → bind → listen
  5. 接受連接並建立 SSL:accept → SSL_new → SSL_set_fd → SSL_accept
  6. 加密收發:SSL_write / SSL_read
  7. 清理:SSL_shutdown → SSL_free → close → SSL_CTX_free

服務端流程圖

客戶端核心流程

  1. 初始化 SSL 庫(同服務端)
  2. 創建 SSL_CTX:SSL_CTX_new(SSLv23_client_method())
  3. 建立 TCP 連接:socket → connect
  4. 建立 SSL 連接:SSL_new → SSL_set_fd → SSL_connect
  5. 驗證證書:SSL_get_peer_certificate → X509_NAME_oneline 解析主體/頒發者
  6. 加密收發:SSL_read / SSL_write
  7. 清理資源

客戶端流程圖

關鍵代碼片段(服務端 SSL 建立)

SSL *ssl = SSL_new(ctx);
SSL_set_fd(ssl, new_fd);
if (SSL_accept(ssl) == -1) {
    ERR_print_errors_fp(stderr);
    close(new_fd);
    continue;
}
// 安全通道已建立,使用 SSL_write/SSL_read 替代 send/recv

證書生成命令

# 生成 2048 位 RSA 私鑰
openssl genrsa -out privkey.pem 2048
# 自簽證書,有效期 3 年
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

編譯與運行

# 編譯
gcc -Wall ssl-server.c -o server -lssl -lcrypto
gcc -Wall ssl-client.c -o client -lssl -lcrypto

# 運行服務端:端口 7838,監聽 127.0.0.1
./server 7838 1 127.0.0.1 cacert.pem privkey.pem

# 運行客戶端
./client 127.0.0.1 7838

服務端運行截圖 客戶端運行截圖

常見問題與注意事項

  • 證書驗證:生產環境需配置 CA 驗證路徑 SSL_CTX_load_verify_locations
  • 協議版本:現代應用建議禁用 SSLv2/v3,使用 TLS_server_method() 並設置 SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION)
  • 錯誤處理:必須檢查每個 SSL 函數返回值,配合 ERR_get_error() 診斷
  • 非阻塞 IO:高併發場景需設置 SSL_MODE_ENABLE_PARTIAL_WRITE 等模式並配合 select/epoll

參考資源

  • OpenSSL 官方文檔:man ssl, man SSL_CTX_new
  • 《Network Security with OpenSSL》O'Reilly
  • 原作者博客:https://zhoulifa.bokee.com
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved