广告

PHP 配置 SSL 证书实现 HTTPS 的详细教程与实操要点

一、理解与准备:域名、证书类型及获取路径

证书类型与适用场景

本文围绕 PHP 配置 SSL 证书实现 HTTPS 的详细教程与实操要点 展开讲解。选择合适的证书类型是第一步,常见的有自签名证书、DV(Domain Validation)、OV(Organization Validation)以及 EV(Extended Validation)证书。自签名对浏览器信任性低,适合开发阶段,而 CA 签发的 DV/OV/EV 证书才会在生产环境中获得广泛信任免费证书如 Let's Encrypt 也是 CA 签发的一种,便于自动化管理

为了证明对域名的控制权,通常需要提交 CSR(证书签名请求)。CSR 中的公钥和域名信息决定了证书绑定的主体,私钥要妥善保管。

openssl req -new -newkey rsa:2048 -nodes -keyout example.key -out example.csr -subj "/CN=example.com/O=My Company/C=US"

获取证书的基本路径与注意事项

生产环境应优先采用 CA 签发的证书,以获得浏览器信任和移动设备兼容性。对于开发阶段可以先使用自签名证书,以便在本地调试无损耗地验证 HTTPS 行为。证书链完整性是关键,确保服务器上提供 fullchain.pem 或等效的证书链文件。

在获取证书之前,需要确保域名已正确解析指向你的服务器地址,并且服务器具备对公开端口 443 的监听能力。域名解析与防火墙策略是前提条件,任何环节异常都可能导致证书无法正常工作。

二、服务器层面的 HTTPS 配置要点

Nginx 配置要点

在 Nginx 中启用 HTTPS 需要证书文件路径、TLS 版本、强制重定向等设置。优先使用 TLS1.2/1.3,禁用旧协议可提升安全性。

典型的 Nginx 服务器块示例,用于监听 443,并指定证书和私钥。证书路径要指向完整链(fullchain.pem),私钥为私钥文件(privkey.pem)。

server {listen 443 ssl;server_name example.com www.example.com;ssl_certificate     /path/to/fullchain.pem;ssl_certificate_key /path/to/privkey.pem;# 安全设置ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:EECDH+AESGCM:EDH+AESGCM';ssl_prefer_server_ciphers on;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;location / {try_files $uri $uri/ =404;}
}

另一个段落,描述如何实现 HTTP 301 重定向到 HTTPS。确保所有请求都被重定向,避免混合内容。

server {listen 80;server_name example.com www.example.com;return 301 https://$host$request_uri;
}

Apache 配置要点

Apache 的配置分成站点虚拟主机(VirtualHost)的监听与 SSL 相关指令。注意启用 mod_ssl 模块,以及正确设置证书路径。

ServerName example.comServerAlias www.example.comSSLEngine onSSLCertificateFile /path/to/cert.pemSSLCertificateKeyFile /path/to/privkey.pemSSLCertificateChainFile /path/to/chain.pem# 站点配置...

三、使用 Let's Encrypt 与 Certbot 实现自动化证书管理

Certbot 安装与证书获取

Let’s Encrypt 提供免费、自动化、开放的证书,通过 Certbot 可以简化安装与续期过程。对于生产环境,优先选择此方案以降低运维成本。

在不同的 Web 服务器上,Certbot 的命令略有差异。下面给出 Nginx 的示例,以及 Apache 的示例。

# 在 Debian/Ubuntu 上安装
sudo apt-get update
sudo apt-get install certbot python3-certbot-nginx
# 获取证书(自动配置 Nginx)
sudo certbot --nginx -d example.com -d www.example.com
# 使用 Apache
sudo apt-get install certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com

自动续期与证书续签策略

Let’s Encrypt 证书有效期较短,通常为 90 天,因此 自动续期是日常运维的关键。Certbot 提供 renew 子命令来执行续期。

sudo certbot renew --quiet

建议在服务器上设置计划任务,在到期前的合适时机执行续期,并在续期后重新加载/重启服务。

# 示例:使用 cron 进行每周检查
0 2 * * 0 certbot renew --quiet --deploy-hook "systemctl reload nginx"

四、PHP 应用层面的 HTTPS 实践与要点

强制 HTTPS、Cookie 安全与会话管理

在 PHP 应用中,除了后端服务器的强制重定向之外,应用层也应确保会话和 Cookies 的安全属性。将 cookie 设置为 Secure、HttpOnly,并考虑 SameSite 策略

setcookie('session_id', session_id(), ['expires' => time() + 3600,'path' => '/','domain' => 'example.com','secure' => true,'httponly' => true,'samesite' => 'Lax'
]);

也可以在入口文件中做简单的强制重定向,以防止未通过 HTTPS 的请求进入应用。使用相对简单的重定向逻辑,避免影响正常流量。

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') {$https = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];header('Location: ' . $https);exit;
}

同时,在应用日志和错误处理上要关注证书错误导致的连接中断,确保用户体验不中断。

PHP 配置 SSL 证书实现 HTTPS 的详细教程与实操要点

五、证书续期、监控与维护要点

到期提醒、监控与日志

证书到期前的提醒是运维的关键环节。结合自动续期和手动检查可以降低突然中断的风险,并记录相关日志以便追踪。

可以通过简单的命令查看证书有效期,并将其纳入日常运维看板。定期核对证书链的完整性也很重要。

openssl x509 -enddate -in /path/to/cert.pem -noout
# 或者查看完整链的到期时间
openssl x509 -text -in /path/to/fullchain.pem | grep 'Not After'

备份与容灾策略

证书、私钥和证书链属于敏感信息,应有安全备份策略。仅在受控的存储中备份私钥,并确保备份与恢复流程可追溯。

# 简单备份示例(谨慎使用,实际请使用受控凭证管理工具)
cp /path/to/cert.pem /backup/certs/example.com.crt
cp /path/to/privkey.pem /backup/certs/example.com.key

广告

后端开发标签