You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Winsock实现HTTPS请求遇OpenSSL编译错误,求解决方案及替代库

解决Winsock下HTTPS请求的OpenSSL编译问题及替代方案

问题背景

你在Winsock程序中尝试发起HTTPS请求,选择用OpenSSL库实现SSL连接,但直接复制GitHub上OpenSSL的include目录到MinGW后,编译时出现大量头文件相关错误,比如configuration.h里的无效字符、未知类型名BN_ULONG等。


一、修复当前OpenSSL编译错误

你的核心问题是用错了OpenSSL的头文件,直接复制GitHub源码里的模板文件是行不通的,下面是具体修复步骤:

  • 错误根源:GitHub上OpenSSL仓库的include/openssl目录里的文件是Perl模板,需要通过脚本生成适配不同平台的实际头文件,编译器无法识别模板里的{- ... -}@这类标记。
  • 修复步骤
    1. 清理错误文件:删除C:\MinGW\include\openssl整个目录,避免和后续正确的头文件冲突。
    2. 安装适配MinGW的预编译OpenSSL:
      • 推荐用MSYS2管理依赖(更省心):打开MSYS2终端,根据你的系统位数执行:
        # 64位系统
        pacman -S mingw-w64-x86_64-openssl
        # 32位系统
        pacman -S mingw-w64-i686-openssl
        
      • 如果直接用原生MinGW:下载适配MinGW的OpenSSL预编译包(比如OpenSSL官方提供的Win32/Win64 MinGW版本),解压后将包内include/openssl复制到C:\MinGW\include,将lib目录下的.a库文件复制到C:\MinGW\lib
    3. 正确编译命令:编译时除了链接Winsock的Ws2_32库,还要加上OpenSSL的sslcrypto库,命令如下:
      gcc clientHTTPS.c -o clientHTTPS.exe -lWs2_32 -lssl -lcrypto
      
    4. 运行时注意:编译好的程序需要OpenSSL的DLL文件(比如libssl-3.dlllibcrypto-3.dll),可以放到程序同目录,或者将DLL所在路径添加到系统环境变量PATH中。

二、适用于Winsock的其他SSL库推荐

如果觉得OpenSSL配置麻烦,这些库更适合Windows/Winsock场景:

  • Schannel:Windows系统自带的SSL/TLS库,无需额外安装依赖,和Winsock原生兼容,直接调用系统API(比如InitializeSecurityContextAcceptSecurityContext)就能建立SSL连接,微软有完整的官方示例代码。
  • libcurl:封装了HTTP/HTTPS请求的全能库,底层可以自动适配Schannel或OpenSSL,你只需要调用curl_easy_init()curl_easy_setopt()等简单接口就能发起HTTPS请求,完全不用自己处理Winsock和SSL的底层细节,非常适合快速开发。
  • mbedTLS:轻量级的开源SSL库,体积小、易编译,有清晰的Windows编译文档,适配MinGW和MSVC,适合嵌入式程序或对体积有要求的项目。

内容的提问来源于stack exchange,提问作者J Nunez

火山引擎 最新活动