OpenSSL 是 PHP 進行 HTTPS 請求、數據加解密、證書驗證、數字簽名等核心密碼學操作的基石。常見場景:
file_get_contents('https://...')、cURL HTTPS 請求openssl_sign()/openssl_verify())檢查是否已啟用:php -m | grep openssl 或 phpinfo() 搜尋 "OpenSSL support => enabled"。
;extension=openssl(PHP 7.2+)或 ;extension=php_openssl.dll(舊版),去掉分號註釋。若無此行,手動添加 extension=openssl。libssl-*.dll、libcrypto-*.dll 複製到 Apache/bin 或系統 PATH 目錄(如 C:\Windows\System32)。關鍵:DLL 版本必須與 PHP 編譯版本一致(VC15/VS16、x86/x64、Thread Safe/Non Thread Safe)。httpd -k restart,IIS 執行 iisreset /restart 或應用程序池回收。以 Ubuntu/CentOS + PHP 5.2~8.x 為例,假設 PHP 安裝路徑為 /usr/local/php(根據實際調整)。
# 確認當前 PHP 版本
php -v
# 下載對應版本源碼(以 7.4.33 為例)
cd /usr/local/src
wget https://www.php.net/distributions/php-7.4.33.tar.gz
tar xzf php-7.4.33.tar.gz
cd php-7.4.33/ext/openssl
/usr/local/php/bin/phpize
# 若報錯 "Cannot find config.m4",執行:
mv config0.m4 config.m4
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-openssl
# 若 OpenSSL 庫非標準路徑,指定 --with-openssl-dir=/usr/local/ssl
make -j$(nproc)
make install
# 輸出提示:Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-nts-20190902/
echo "extension=openssl.so" >> /usr/local/php/etc/php.ini
# 或建議獨立文件:echo "extension=openssl.so" > /usr/local/php/etc/conf.d/openssl.ini
systemctl restart php-fpm # 或 service php7.4-fpm restart
nginx -s reload # 若使用 Nginx + PHP-FPM
# 1. 命令行檢查
php -m | grep openssl
php -r "var_dump(OPENSSL_VERSION_TEXT);"
# 2. 代碼驗證
<?php
var_dump(extension_loaded('openssl'));
$ssl = stream_context_create(['ssl'=>['verify_peer'=>false]]);
echo file_get_contents('https://www.google.com', false, $ssl) ? 'HTTPS OK' : 'HTTPS FAIL';
?>
| 現象 | 可能原因 | 排查命令 |
|---|---|---|
| php -m 無 openssl | 擴展未加載 | php --ini | grep Loaded; cat /usr/local/php/etc/php.ini | grep openssl |
| 啟動報錯 "undefined symbol" | OpenSSL 庫版本不匹配 | ldd /usr/local/php/lib/php/extensions/.../openssl.so | grep ssl |
| HTTPS 請求失敗 | CA 證書缺失 | curl -v https://...; 設置 openssl.cafile=/etc/ssl/certs/ca-certificates.crt |
| PHP-FPM 不生效 | 未重啟進程 | systemctl status php-fpm; kill -USR2 $(cat /run/php-fpm.pid) 熱重載 |
Dockerfile 中直接安裝系統包,避免手動編譯:
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y libssl-dev \
&& docker-php-ext-install openssl
# 或 Alpine 基礎鏡像
FROM php:8.2-fpm-alpine
RUN apk add --no-cache openssl-dev \
&& docker-php-ext-install openssl
disable_functions = openssl_*(極少見)。openssl.cafile、openssl.capath 指向系統 CA 憑證包(ca-certificates 包),定期更新。platform 配置或基礎鏡像標籤鎖定 OpenSSL 版本,防止系統升級導致 ABI 變更。openssl_error_string()、SSL 握手失敗率、證書過期時間(Prometheus + node_exporter ssl_cert_expiry 指標)。啟用 OpenSSL 看似簡單,實則涉及編譯工具鏈、動態鏈接庫解析、CA 信任鏈、進程管理等多層知識。Windows 依賴預編譯二進制兼容,Linux 推薦包管理器或 docker-php-ext-install,源碼編譯僅作為特定版本無包源時的備選。掌握驗證腳本與排障矩陣,才能在故障夜晚快速定位、恢復業務。