Debian上OpenSSL、Zscaler和PHP相关TLS/SSL问题指南
2024-03-28 22:06:54
Debian 上 OpenSSL、Zscaler 和 PHP 问题疑难解答
在 Debian 系统上,配置了 Zscaler 代理服务器进行 TLS/SSL 检查,这可能会导致应用程序出现故障。在本指南中,我们将探讨导致此问题的根本原因并逐步指导您解决这些问题。
问题说明
当从命令行使用 curl、wget 或 OpenSSL 进行测试时,您可能会收到以下错误消息:
Verify return code: 20 (unable to get local issuer certificate)
然而,当使用 -CAfile
参数指定 CA 证书时,测试可以成功。此外,使用 Symfony PHP 框架的应用程序调用 get_file_contents()
函数时会超时。
原因分析
命令行 OpenSSL 使用 CA 证书 :默认情况下,命令行 OpenSSL 工具不会使用系统证书存储中的 CA 证书进行验证。因此,需要使用 -CAfile
参数指定 CA 证书。
get_file_contents() 超时 :get_file_contents()
函数使用系统证书存储中的 CA 证书进行验证,但由于 Zscaler 代理服务器的 TLS/SSL 检查,无法获取到本地颁发者证书,导致验证失败并超时。
解决步骤
1. 添加 CA 证书到系统证书存储
如果 CA 证书尚未安装到系统证书存储,请将其导入:
sudo cp /etc/ssl/certs/zScalerRootCA.crt /usr/local/share/ca-certificates/zscaler.crt
sudo update-ca-certificates
2. 更新 PHP CA 证书库
更新 PHP CA 证书库,以便应用程序可以访问系统证书存储中的 CA 证书:
sudo apt-get install ca-certificates
3. 配置 PHP 忽略代理
在 PHP 配置文件中(通常为 /etc/php/7.4/cli/php.ini
),添加以下行以忽略 Zscaler 代理服务器:
curl.cainfo = /etc/ssl/certs/ca-certificates.crt
openssl.cafile = /etc/ssl/certs/ca-certificates.crt
4. 重启 Apache 或 Nginx
重启 Web 服务器以使 PHP 配置生效:
sudo systemctl restart apache2
或
sudo systemctl restart nginx
5. 验证
使用以下命令验证问题是否已解决:
- 命令行 OpenSSL 测试:
openssl s_client -connect kimai.org:443 -proxy zscalerIP:port
输出应显示“Verify return code: 0 (ok)”。
- PHP
get_file_contents()
函数测试:
php -r 'echo file_get_contents("https://kimai.org");'
输出应返回 Kimai 网站的 HTML。
常见问题解答
1. 我仍然遇到问题,该怎么办?
检查防火墙或安全组设置,确保允许必要的端口通信。您还可以使用 wireshark 或 tcpdump 等网络分析工具来查看网络流量,并排除其他潜在问题。
2. 为什么需要指定 CA 证书?
默认情况下,OpenSSL 工具不信任自签名证书或根证书颁发机构 (CA) 未颁发的证书。因此,需要手动指定 CA 证书以建立信任链。
3. 如何在 PHP 中忽略 Zscaler 代理?
通过在 PHP 配置文件中设置 curl.cainfo
和 openssl.cafile
参数,可以配置 PHP 忽略 Zscaler 代理。
4. 为什么 PHP 的 get_file_contents()
函数会超时?
由于 Zscaler 代理服务器的 TLS/SSL 检查,get_file_contents()
函数在验证证书时会超时。更新 PHP CA 证书库并忽略代理可以解决此问题。
5. 如何重启 Apache 或 Nginx?
您可以使用 systemctl
命令重新启动 Apache 或 Nginx。对于 Apache,使用 sudo systemctl restart apache2
,对于 Nginx,使用 sudo systemctl restart nginx
。
结论
通过遵循本文中概述的步骤,您应该能够解决 Debian 系统上 OpenSSL、Zscaler 和 PHP 相关的 TLS/SSL 问题。这些问题通常是由缺失的 CA 证书或系统证书存储中的 CA 证书不正确配置引起的。通过仔细执行这些步骤,您可以确保您的应用程序能够安全可靠地与受 Zscaler 代理服务器保护的网站通信。