php 实现ssl
PHP 实现 SSL 的基本方法
使用 cURL 发起 HTTPS 请求 通过 cURL 库可以轻松发起 HTTPS 请求,确保通信加密。以下是一个示例代码:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/cacert.pem");
$response = curl_exec($ch);
curl_close($ch);
CURLOPT_SSL_VERIFYPEER 设置为 true 时验证对等证书,CURLOPT_CAINFO 指定 CA 证书路径。
配置 PHP 流上下文
使用 stream_context_create 创建安全的流上下文,适用于 file_get_contents 等函数:
$context = stream_context_create([
"ssl" => [
"verify_peer" => true,
"cafile" => "/path/to/cacert.pem"
]
]);
$response = file_get_contents("https://example.com", false, $context);
服务器端 SSL 配置
在 Apache 中启用 SSL
确保 Apache 已加载 mod_ssl 模块,并在虚拟主机配置中添加以下内容:
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
SSLCACertificateFile /path/to/ca.pem
</VirtualHost>
在 Nginx 中启用 SSL Nginx 配置示例:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_trusted_certificate /path/to/ca.pem;
}
生成自签名证书
使用 OpenSSL 生成证书 以下命令生成自签名证书和私钥:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /path/to/key.pem -out /path/to/cert.pem
生成过程中会提示输入国家、组织等信息。
PHP 中验证 SSL 证书
禁用证书验证(不推荐) 开发环境中可能需要临时禁用验证:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
stream_context_set_option($context, "ssl", "verify_peer", false);
自定义证书验证
通过设置 CURLOPT_SSL_VERIFYHOST 和 CURLOPT_CAINFO 实现更严格的验证:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, "/path/to/custom_ca.pem");
常见问题处理
证书路径问题 确保 PHP 有权限读取证书文件,路径需使用绝对路径。
证书过期或无效 定期检查证书有效期,使用工具验证证书链完整性:
openssl verify -CAfile /path/to/ca.pem /path/to/cert.pem
协议版本问题 明确指定 TLS 版本以避免安全问题:
curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);






