用户在配置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 请求时的证书验证。

安全提示:永远不要将私钥放在网站根目录,保持权限最小化。