XAMPP中Apache和PHP需同步更新同版本、同架构、同编译器的OpenSSL DLL(如libssl-1_1.dll与libcrypto-1_1.dll),覆盖xampp\apache\bin\和xampp\php\目录,并清理旧版遗留文件;同时必须在httpd-ssl.conf中显式配置SSLProtocol和SSLCipherSuite以启用TLSv1.2+并禁用弱协议。

确认 XAMPP 当前 OpenSSL 版本和实际依赖路径
XAMPP 自带的 openssl.exe 和动态库(如 libssl-1_1.dll、libcrypto-1_1.dll)通常位于 \xampp\apache\bin\ 和 \xampp\php\ 目录下,但 Apache 和 PHP 可能各自加载不同副本。直接替换系统 PATH 中的 OpenSSL 无效,必须定位到 Apache 和 PHP 实际加载的 DLL 文件。
执行以下操作验证:
- 在命令行运行
xampp\apache\bin\openssl.exe version -a,查看 Apache 使用的版本 - 运行
xampp\php\php.exe -r "print_r(openssl_get_cert_locations());",检查 PHP 加载的openssl.cafile和库路径 - 用
Process Explorer(Sysinternals 工具)附加到httpd.exe进程,搜索已加载的libssl*模块,确认物理路径
替换 Apache 和 PHP 共用的 OpenSSL DLL 文件(Windows)
Apache(httpd)与 PHP(尤其是 php_openssl.dll 扩展)高度依赖 ABI 兼容的 OpenSSL 二进制。不能只升级其中一个;必须同步替换 libssl-1_1.dll 和 libcrypto-1_1.dll,且版本号、架构(x86/x64)、编译器(VC16/VC17)需完全一致。
推荐做法:
- 从 Shining Light Productions 下载对应 VC 版本的 Win32 OpenSSL(例如:Win64 OpenSSL v3.0.13 Light,VC17),解压后提取
bin\libssl-3.dll和bin\libcrypto-3.dll - 若坚持使用 OpenSSL 1.1.1(如因旧模块兼容性),下载
Win64 OpenSSL v1.1.1w,取其中libssl-1_1.dll和libcrypto-1_1.dll - 将这两个 DLL 文件**同时覆盖**到
xampp\apache\bin\和xampp\php\两个目录(不要仅覆盖一个) - 删除
xampp\apache\bin\下可能存在的旧版ssleay32.dll、libeay32.dll(OpenSSL 1.0 遗留文件,冲突源)
更新 Apache 配置以启用 TLSv1.2+ 并禁用弱协议
仅升级 DLL 不等于自动启用新协议。Apache 的 httpd.conf 或 httpd-ssl.conf 必须显式配置 SSLProtocol 和 SSLCipherSuite,否则仍默认允许 TLSv1.0 等不安全协议。
关键配置项(在 httpd-ssl.conf 的 <VirtualHost _default_:443> 块内):
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384 SSLHonorCipherOrder on
注意:
-
SSLProtocol中的all表示“所有支持的协议”,但必须显式用减号排除旧版本;仅写-TLSv1不够,TLSv1.1也必须排除 - OpenSSL 3.0+ 默认禁用 RSA key exchange,若需兼容极老客户端,可加
ECDHE-RSA-AES128-SHA,但会降低安全性 - 修改后必须运行
xampp\apache\bin\httpd.exe -t验证语法,再重启 Apache
PHP 中验证 OpenSSL 功能是否正常启用
PHP 调用 OpenSSL 的函数(如 openssl_encrypt()、stream_socket_enable_crypto())可能因 DLL 不匹配或扩展未重载而静默失败。常见错误包括:error:141F70BF:SSL routines:final_key_block:unknown cipher returned 或 Call to undefined function openssl_x509_parse()。
排查步骤:
- 运行
php -m | findstr openssl,确认openssl扩展已加载 - 执行
php -r "var_dump(defined('OPENSSL_VERSION_TEXT'));",返回bool(true)表示常量可用 - 测试 TLS 连接:
php -r "\$ctx = stream_context_create(['ssl'=>['crypto_method'=>STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT]]); var_dump(stream_socket_client('tls://google.com:443', \$e, \$s, 5, STREAM_CLIENT_CONNECT, \$ctx));" - 若报错
Unable to set the SSL crypto method,说明 PHP 加载的 OpenSSL 库不支持该方法——大概率是 DLL 未统一或版本太低
真正麻烦的是 Apache 和 PHP 对 OpenSSL 的加载顺序与缓存机制:即使 DLL 文件已更新,Windows 可能从其他路径(如 system32)优先加载旧版。最稳妥的做法是确保 XAMPP 目录独占控制权,并在启动前清空 %PATH% 中非 XAMPP 的 OpenSSL 相关路径。


















