2024年PHP日本大会

安装

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

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

从PHP 8.2.0开始,Windows默认使用OpenSSL 3.0.0,其中一些算法已被认为是遗留算法。这些算法通常已不再使用,已被密码学界认为是不安全的,或者类似的情况。这些算法仍然可以通过遗留提供程序(extras/ssl/legacy.dll)使用;其用法在OpenSSL手册的» 提供程序配置部分进行了描述。

变更日志

版本 描述
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

添加注释

用户贡献笔记 8条笔记

45
Alan
13年前
最近在我的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的configure之前定义OPENSSL_LIBS和OPENSSL_CFLAGS环境变量。对于FreeBSD 12,以下方法有效:

export OPENSSL_LIBS="-L/usr -lssl -lcrypto -lz" && export OPENSSL_CFLAGS="-I/usr/include" && ./configure --with-openssl [...other configure options...]
10
epos_jk
7年前
从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标志,这意味着忽略环境变量),否则PHP将忽略你的环境变量。顺便说一句,这应该成为文档的一部分……
8
jaimz at vertigolabs dot org
10年前
我想指出的是,当您使用openssl编译并指定目录时,acinclude.m4和aclocal.m4会按照如下方式使用该目录

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

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

这是错误的: --with-openssl=/usr/local/includes/openssl
这是正确的: --with-openssl=/usr/local
5
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
16年前
症状和设置
------------------

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

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

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

我还在我的Web服务器日志(<apache目录>/logs/ssl.log和<apache目录>/logs/access.log)中发现了此错误。

PHP Warning: PHP Startup: Unable to load dynamic library 'C:\\Program Files\\PHP\\ext\\php_openssl.dll' - The operating system cannot run %1.\r\n in Unknown on line 0

我在Windows上运行的是PHP 5.2.6和Apache 2.2.3。

原因
-----

这是由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目录>\bin,而不是<php目录>。PHP在<apache目录>\bin中找到了过时的libeay.dll和ssleay.dll版本(可能是在我在Web服务器中启用SSL支持时安装的)。因此,永远不会访问windows\system32中的最新版本。

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

解决方案
--------

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

希望这对遇到此问题的其他人有所帮助。

Mark。
0
anrdaemon at freemail dot ru
10年前
如果您想配置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
To Top