用户在配置SSL证书主要是在Web服务器层面(Apache/Nginx)进行。在PHP代码中,如果你需要发起HTTPS请求,则需要确保cURL配置正确,特别是CA证书的路径。在生产环境中,务必启用证书验证以保证安全。因此在 PHP 中配置 SSL 证书主要涉及 Web 服务器配置(如 Apache/Nginx),而非直接通过 PHP 代码配置。下面是完整步骤:
一、为 Web 服务器配置 SSL(通用步骤)
1. 获取 SSL 证书
从证书颁发机构(CA)购买或使用免费证书(如 Let's Encrypt)。
你会得到三个文件:
证书文件(如 domain.crt)
私钥文件(如 domain.key)
CA 中间证书(如 ca_bundle.crt)
2. 上传证书到服务器
将证书文件上传到安全目录(如 /etc/ssl/):
bash
/etc/ssl/certs/domain.crt # 公钥证书
/etc/ssl/private/domain.key # 私钥(权限设为 600)
/etc/ssl/certs/ca_bundle.crt # 中间证书
二、服务器配置示例
Apache 配置
启用 SSL 模块:
bash
sudo a2enmod ssl
编辑虚拟主机配置(/etc/apache2/sites-available/default-ssl.conf):
apache
<VirtualHost *:443>
ServerName your-domain.com
DocumentRoot /var/www/html
SSL 配置
SSLEngine on
SSLCertificateFile /etc/ssl/certs/domain.crt
SSLCertificateKeyFile /etc/ssl/private/domain.key
SSLCertificateChainFile /etc/ssl/certs/ca_bundle.crt # 中间证书
强制 HTTPS 重定向(可选)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
</VirtualHost>
重启 Apache:
bash
sudo systemctl restart apache2
Nginx 配置
编辑站点配置(/etc/nginx/sites-available/default):
nginx
server {
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/ssl/certs/domain.crt;
ssl_certificate_key /etc/ssl/private/domain.key;
ssl_trusted_certificate /etc/ssl/certs/ca_bundle.crt; # 中间证书链
root /var/www/html;
index index.php;
强制 HTTPS(可选)
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
重启 Nginx:
bash
sudo systemctl restart nginx
三、PHP 代码中的 SSL 相关设置
1. 验证 HTTPS 连接
php
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
exit();
}
2. cURL 请求使用 SSL
如果 PHP 需通过 cURL 访问其他 HTTPS 服务:
php
$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"); // CA 证书路径
$response = curl_exec($ch);
3. 修改 PHP.ini 全局 CA 证书
编辑 php.ini 指定 CA 证书包(解决 cURL SSL 错误):
ini
curl.cainfo = "/etc/ssl/certs/ca-certificates.crt"
openssl.cafile = "/etc/ssl/certs/ca-certificates.crt"
四、验证 SSL 配置
访问 https://your-domain.com,检查浏览器锁标志。
使用在线工具检测:
SSL Labs SSL Test
Why No Padlock?
常见问题解决
证书链不完整
合并中间证书到公钥文件:
bash
cat domain.crt ca_bundle.crt > combined.crt
在配置中使用 combined.crt。
私钥权限问题
确保私钥仅对 root 可读:
bash
chmod 600 /etc/ssl/private/domain.key
PHP cURL 报错 "SSL certificate problem"
下载 CA 证书包 并设置 curl.cainfo。
核心步骤:将 SSL 证书配置在 Web 服务器(Apache/Nginx)中。
PHP 角色:处理重定向、验证请求来源或发起 HTTPS 请求时的证书验证。
安全提示:永远不要将私钥放在网站根目录,保持权限最小化。