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

在您的安裝中,您需要決定是要將設定檔安裝在預設路徑中,還是將其安裝在其他位置,並使用環境變數(可能以每個虛擬主機為基礎)來找到設定檔。請注意,可以使用需要設定檔的函式的 選項 從腳本覆寫預設路徑。
注意

確保非特權使用者無法修改 openssl.cnf

從 OpenSSL 3.0.0 開始(從 PHP 8.2.0 開始在 Windows 上預設使用),一些演算法已被視為舊版。這些演算法通常已不再使用,已被密碼學界視為不安全,或類似的情況。這些演算法仍然可以透過舊版提供者 (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 則註記

Alan
13 年前
最近在我的 Windows 7 開發機器上安裝了 Apache 2.2 和 PHP 5.2.17,我想分享一下關於如何設定載入正確版本 OpenSSL DLL 的心得。許多人在其他地方發文提到了如果載入錯誤版本的 DLL 會導致「DLL 地獄」。

首先,安裝 Apache 2.2 並檢查其運作,然後從 http://windows.php.net/download/. 下載適用於 Windows 的 PHP 二進制檔案。請注意,根據該頁面側邊欄的說明,目前建議與 Apache 2 搭配使用的 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 地獄。
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 [...其他 configure 選項...]
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)
vitoandre.doria
6 年前
如同 https://php.dev.org.tw/manual/de/reserved.variables.environment.php#98113 中所指出的,請確保 php.ini 中已設定 variables_order = "EGPCS"(可能沒有 E 旗標,這表示忽略環境變數),否則 PHP 將會忽略您的環境變數。順帶一提,這應該列入文件中...
jaimz at vertigolabs dot org
10 年前
我只想指出,當您使用 openssl 編譯並指定目錄時,acinclude.m4 和 aclocal.m4 會使用該目錄,如下所示

{您的目錄}/includes/openssl/{標頭檔}

也就是說,您要指定 includes 目錄所在的目錄,而不是包含標頭檔的特定目錄。

這是錯誤的 --with-openssl=/usr/local/includes/openssl
這是正確的 --with-openssl=/usr/local
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

完成!
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 dir>/logs/ssl.log 和 <apache dir>/logs/access.log)中也發現了這個錯誤。

PHP 警告:PHP 啟動:無法載入動態程式庫 'C:\\Program Files\\PHP\\ext\\php_openssl.dll' - 作業系統無法執行 %1。\r\n 於未知的第 0 行

我的環境是 Windows 上執行的 Apache 2.2.3 和 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 目錄>\bin,而不是 <php 目錄>。PHP 在 <apache 目錄>\bin 中找到了過期的 libeay.dll 和 ssleay.dll 版本(可能是在我啟用 Web 伺服器的 SSL 支援時安裝的)。因此,windows\system32 中的最新版本永遠不會被載入。

注意:雖然我的問題是由 Apache2 特定的設定引起的,但我可以想像其他人可能會遇到這個問題,例如,如果他們將 openssl dll 安裝在 PHP 目錄中,並將此目錄添加到 PATH 中。我沒有檢查過,但我可以想像,如果路徑中的另一個目錄包含過期的 openssl dll,並且它在 PHP 目錄之前列出,則會發生類似的情況。

解決方案
--------

您可以替換搜尋順序中第一個位置的 dll,或者像我一樣,您可以在 windows system32 目錄中安裝最新的 openssl dll,並將 windows\system32 之前的搜尋順序位置中的 ssleay.dll 和 libeay.dll 檔案重新命名為 .old。

希望這可以幫助其他可能遇到此問題的人。

Mark.
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