安装

要使用 PHP 的 OpenSSL 支持,您还必须编译 PHP --with-openssl

OpenSSL 库在运行时还需要其他要求才能正常运行。最值得注意的是,OpenSSL 需要访问随机或伪随机数生成器;在大多数类 Unix 和类 Unix 平台(包括 Linux)上,这意味着它必须访问 /dev/urandom/dev/random 设备。

配置选项 --with-system-ciphers 可用,它会导致 PHP 使用系统密码列表,而不是硬编码的默认值。

注意: 注意 Win32 用户

为了使此扩展正常工作,Windows 系统 PATH 必须提供 DLL 文件。有关如何执行此操作的信息,请参阅名为 "如何在 Windows 上将我的 PHP 目录添加到 PATH" 的 FAQ。虽然将 DLL 文件从 PHP 文件夹复制到 Windows 系统目录也可以(因为系统目录默认情况下在系统的 PATH 中),但此方法不推荐。此扩展需要以下文件位于 PATH 中: libeay32.dll,或者,从 OpenSSL 1.1 开始,libcrypto-*.dll

此外,如果您计划使用密钥生成和证书签名函数,则需要在系统上安装有效的 openssl.cnf 文件。我们在 win32 二进制发行版中包含了一个示例配置文件,位于 extras/ssl 目录中。

PHP 将使用以下逻辑搜索 openssl.cnf

  • 如果设置了 OPENSSL_CONF 环境变量,则它将用作配置文件的路径(包括文件名)。
  • 如果设置了 SSLEAY_CONF 环境变量,则它将用作配置文件的路径(包括文件名)。
  • 将假定文件 openssl.cnf 位于默认证书区域,如编译 openssl DLL 时配置的那样。这通常意味着默认文件名是 C:\Program Files\Common Files\SSL\openssl.cnf (x64) 或 C:\Program Files (x86)\Common Files\SSL\openssl.cnf (x86),或者,在 PHP 7.4.0 之前,C:\usr\local\ssl\openssl.cnf

在您的安装中,您需要决定是将配置文件安装在默认路径中,还是将其安装在其他位置并使用环境变量(可能是在每个虚拟主机基础上)来定位配置文件。请注意,可以使用需要配置文件的函数的 options 从脚本中覆盖默认路径。
警告

确保非特权用户无法修改 openssl.cnf

变更日志

版本 描述
7.4.0 --with-openssl[=DIR] 不再接受目录参数,而是通过将 pkg-config 变量 PKG_CONFIG_PATH 设置为 OpenSSL 位置,或者通过指定 OPENSSL_LIBSOPENSSL_CFLAGS 变量来实现。
7.4.0 OpenSSL 默认配置路径已从 C:\usr\local\ssl 更改为 C:\Program Files\Common Files\SSLC:\Program Files (x86)\Common Files\SSL

添加笔记

用户贡献笔记 9 notes

41
Alan
12 年前
最近在我的 Windows 7 开发机器上安装了 Apache2.2 和 PHP 5.2.17,我想分享一下我关于如何设置东西来加载正确版本的 OpenSSL DLL 的发现。许多人在其他地方发布了关于如果加载了错误版本会导致的“DLL 地狱”的信息。

首先,安装 Apache 2.2 并检查其运行,然后从 http://windows.php.net/download/. 下载 PHP 的 Windows 二进制文件。请注意,根据该页面上的侧边栏,目前推荐与 Apache2 一起使用的 PHP 版本是 5.2.17,即使它已经过时了。此外,此版本附带了您使用 OpenSSL 所需的所有 DLL——无需像旧的 PHP 手册建议的那样重新编译。

在验证 PHP 安装后,通过取消注释以下行来开启 OpenSSL 支持:

extension=php_openssl.dll

在 php.ini 中,您将在 PHP 目录中找到它(我假设您将它设为 c:/PHP)。接下来检查 php_openssl.dll 的位置,您应该在 c:/PHP/ext 中找到它。同样在 php.ini 中找到 extension_dir 键,并将它的值更改为 c:/php/ext。接下来,将此位置放在 PATH 的末尾(无需重新启动)。

此时,当您启动 Apache 时,它会尝试加载 php_openssl.dll,但如果您的设置与我的类似,您将看到错误。我更喜欢手动启动 Apache,错误会出现在一个对话框中:“无法在动态链接库 LIBEAY32.dll 中找到序数 4114”。(我不确定如果将 Apache 作为服务启动,是否会收到此消息)。Apache 日志中也包含一条错误消息,表明无法加载 php_openssl.dll,虽然该消息没有提到 libeay32.dll。欢迎来到 DLL 地狱。

Libeay32.dll 出现是因为 php_openssl.dll 依赖于它(以及 ssleay32.dll)。我认为发生的事情是,Apache 首先尝试从 extension_dir 键指定的路径以编程方式加载 php_openssl.dll。但是,所谓的依赖 DLL 的加载则留给了 Windows 的默认机制。如果 Windows 找到了不兼容版本的依赖 DLL,您将收到错误。

因此,显然解决方案是确保加载了 libeay32.dll 的正确版本。在我的机器上,至少还有其他三个进程加载了不同版本的同一个 DLL。包括 Mozy 备份客户端、Windows 资源管理器(因为 Mozy 在资源管理器中安装了支持)和 OpenOffice 套件。我的机器在这方面与专用服务器有很大不同,在专用服务器上,人们可能希望尽可能少地使用无关进程。大概在服务器上,人们可以遵循建议将 dll 复制到 system32 目录的建议,例如。但我不会通过进行系统范围的更改来破坏我的其他程序。

那么该怎么办呢?我发现有关 Windows 如何搜索 DLL 的可用信息并不是很有用,主要是因为我不理解它。但它确实表明 Windows 第一次寻找的位置是“应用程序加载的目录”。

为了简短起见,经过大量的实验,我得出了一个关键的认识——“应用程序”是 APACHE,而不是 PHP。因此,我将 libeay32.dll 复制到 Apache2.2/bin 目录。问题解决了。没有错误消息,运行 phpinfo 确认 OpenSSL 存在并已启用。

祝您好运,远离 DLL 地狱。
3
php-net-comment at shaunc dot com
2 年前
FreeBSD 将现代版本的 OpenSSL 作为其基本系统的一部分,但似乎没有 pkg-config 文件,因此 PHP 配置脚本无法找到库。在 FreeBSD 上编译 PHP 时,您应该在运行 PHP 的配置之前定义 OPENSSL_LIBS 和 OPENSSL_CFLAGS 环境变量。对于 FreeBSD 12,以下方法有效

export OPENSSL_LIBS="-L/usr -lssl -lcrypto -lz" && export OPENSSL_CFLAGS="-I/usr/include" && ./configure --with-openssl [...其他配置选项...]
9
epos_jk
6 年前
从 1.1.0 版本开始,OpenSSL 改变了他们的库名称!
libeay32.dll 现在是 libcrypto-*.dll(例如,对于 64 位 Windows 上的 OpenSSL 1.1.x,它是 libcrypto-1_1-x64.dll)
ssleay32.dll 现在是 libssl-*.dll(例如,对于 64 位 Windows 上的 OpenSSL 1.1.x,它是 libssl-1_1-x64.dll)
3
vitoandre.doria
6 年前
如这里所述 https://php.net/manual/de/reserved.variables.environment.php#98113 确保在您的 php.ini 中设置了 variables_order = "EGPCS"(可能没有 E 标志,这意味着忽略 Env 变量),否则 PHP 会忽略您的环境变量。这应该成为文档的一部分……
8
jaimz at vertigolabs dot org
9 年前
我只想指出,当您使用 openssl 进行编译并且指定了目录时,acinclude.m4 和 aclocal.m4 会将该目录作为

{您的目录}/includes/openssl/{头文件}

也就是说,您要指定包含 include 目录的目录,而不是包含头文件的特定目录。

这 是错误的 --with-openssl=/usr/local/includes/openssl
这 是正确的 --with-openssl=/usr/local
6
Fernando rubio
13 年前
OpenSSL 和 IIS

打开 php.ini
取消注释以下内容
extension=php_openssl.dll

确保您已将以下部分配置为指向您的 PHP 安装目录(在我的情况下位于第二个分区中的 e:\php)(强烈建议这样做)。

;可加载扩展(模块)所在的目录。
extension_dir = "e:/php/ext"

将您的 PHP 目录添加到 PATH 变量中

开始>运行>输入 cmd
在 Windows 控制台中输入
set PATH=%PATH%;e:\php
(请记住将 e:\php 替换为您的目录)
(注意使用 %path% 等同于 var+=value,因此该目录将附加到变量的末尾)

php5 附带了 zip 包中的所有 dll,因此如果您将 php 目录添加到 path 变量,您无需将任何内容移动到您的 Windows 系统目录(对于以后的更新非常安全,因为您只需替换您的 php 目录的内容)

完成所有这些步骤后,您就可以准备好了... 但是当然,您需要重新启动 IIS 以应用更改,因此

开始>运行>inetsrv/iis.msc
右键单击您的计算机
所有任务>重新启动 IIS

完成!
4
mtudor AT icefusion remove me DOT co uk
15 年前
症状和设置
------------------

对于任何在 WINDOWS 上启用 PHP openssl 扩展时遇到问题的人。

我取消了注释:extension=php_openssl.dll 并安装了 ssleay.dll 和 libeay.dll 的最新版本到 <windows>\system32。

当我重新启动我的 Web 服务器并检查 phpinfo() 时,没有 "openssl" 标题部分(尽管在其他部分中有对 openssl 的引用)。

我也在我的 Web 服务器日志中发现了这个错误 (<apache dir>/logs/ssl.log 和 <apache dir>/logs/access.log)。

PHP 警告:PHP 启动:无法加载动态库 'C:\\Program Files\\PHP\\ext\\php_openssl.dll' - 操作系统无法运行 %1。\r\n 在 Unknown 中的第 0 行

我在 Apache 2.2.3 for Windows 上运行 PHP 5.2.6。

原因
-----

这是因为 PHP 获取了 libeay.dll 和 ssleay.dll 的错误版本,这些版本在我的计算机上的多个位置存在。

当任何应用程序尝试使用 Windows 中的 dll 文件时,系统将按照以下顺序搜索此文件
1. 应用程序加载它的目录。
2. windows\system32 目录。
3. windows\system 目录。
4. windows 目录。
5. 当前目录。
6. PATH 环境变量中列出的目录。

http://msdn.microsoft.com/en-us/library/ms682586.aspx

对于在 Apache 下运行的 PHP,应用程序目录是 <apache dir>\bin 而不是 <php dir>。PHP 在 <apache dir>\bin 中找到了过时的 libeay.dll 和 ssleay.dll 版本(可能是当我启用 Web 服务器的 SSL 支持时安装的)。因此,windows\system32 中的最新版本从未被访问。

注意:虽然我的问题是由 Apache2 特定的配置引起的,但我可以想象其他人可能会遇到这个问题,例如,如果他们在 PHP 目录中安装 openssl dll 并将此目录添加到 PATH。我没有检查,但我认为如果路径中的另一个目录包含过时的 openssl dll 并且它在 PHP 目录之前列出,那么类似的情况也会发生。

解决方法
--------

要么替换搜索顺序中第一个位置的 dll,要么像我一样,您可以在 windows system32 目录中安装最新的 openssl dll,然后在 windows\system32 之前的位置的搜索顺序中将 ssleay.dll 和 libeay.dll 文件重命名为 .old。

希望这对其他人有帮助。

马克。
0
anrdaemon at freemail dot ru
9 年前
如果您想配置 Windows 下的 Apache2 以使用 OpenSSL - 请,看在上帝的份上,不要到处复制,更糟的是 - 覆盖任何 DLL。
首先,现代 Apache2 附带了相关的库,其次 - 即使由于某种原因它现在无法找到正确的库 - 您也可以告诉它使用正确的库。
LoadLibrary。
是的。
就这么简单。

LoadLibrary C:/apache2/bin/libeay32.dll
LoadLibrary C:/apache2/bin/ssleay32.dll
LoadLibrary C:/php5/php5ts.dll
LoadModule php5_module C:/php5/php5apache2_4.dll
-9
epos_jk
6 年前
您不需要复制文件就可以将 OpenSSL 与 Apache 2.4 一起使用 - 相反,在您的 apache 配置文件中使用 LoadFile 指令
例如
LoadFile "C:/php7/libcrypto-1_1-x64.dll"
LoadFile "C:/php7/libssl-1_1-x64.dll"
LoadFile "C:/php7/libssh2.dll"
To Top