文档中心
Apache+PHP鐜閰嶇疆HTTPS璇佷功鐨勪繚濮嗙骇鏁欑▼
时间 : 2025-09-27 15:40:59浏览量 : 3

作为一名网络安全工程师,我经常遇到客户问:"为什么我的网站一定要用HTTPS?"想象一下,如果你在网上填写银行卡信息时,这些数据是"裸奔"在网络上的,就像把密码写在明信片上邮寄一样危险。本文将手把手教你如何在Apache+PHP环境中配置HTTPS证书,让你的网站穿上安全的"防弹衣"。
一、HTTPS证书的重要性
先讲个真实案例:去年某电商平台因为没启用HTTPS,导致黑客在公共WiFi环境下轻松截获了用户的登录信息,造成数千账户被盗。这就是典型的"中间人攻击"——好比邮递员偷偷拆开你的信件看了再封上。
HTTPS通过SSL/TLS协议实现三大保护:
1. 加密传输:像用密码本写信,只有收件人能读懂
2. 身份认证:确保你访问的是真银行而非钓鱼网站
3. 数据完整性:防止内容在传输中被篡改
二、准备工作
1. 环境检查
```bash
查看Apache版本
httpd -v
查看PHP版本
php -v
检查SSL模块是否加载
apachectl -M | grep ssl
```
如果看不到`ssl_module`,需要先启用:
a2enmod ssl
systemctl restart apache2
2. 证书获取途径对比
| 类型 | 适用场景 | 推荐商家 | 有效期 | 价格 |
||-|-|--||
| DV证书 | 个人博客 | Let's Encrypt | 90天 | 免费 |
| OV证书 | 企业官网 | DigiCert | 1年 | ¥800+/年 |
| EV证书 | 金融平台 | GlobalSign | 1年 | ¥2000+/年 |
新手建议从Let's Encrypt免费证书开始练手。
三、Let's Encrypt实战配置
Step1:安装Certbot工具
sudo apt update
sudo apt install certbot python3-certbot-apache
Step2:获取证书(以example.com为例)
sudo certbot --apache -d example.com -d www.example.com
这个命令会:
1. 自动验证域名所有权(通常需要你能修改DNS或网站文件)
2.生成以下关键文件:
- `/etc/letsencrypt/live/example.com/fullchain.pem`(证书链)
- `/etc/letsencrypt/live/example.com/privkey.pem`(私钥)
Step3:自动配置Apache
Certbot会自动修改你的Apache配置,典型变化如下:
```apacheconf
ServerName example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
PHP配置保持不变...
四、手动配置商业SSL证书
如果你购买了商业证书(如阿里云、腾讯云颁发的),通常会收到:
- `.crt`或`.pem`文件(公钥)
- `.key`文件(私钥)
- CA Bundle文件(中级证书)
配置示例:
SSLCertificateFile /path/to/your_domain.crt
SSLCertificateKeyFile /path/to/your_private.key
SSLCertificateChainFile /path/to/ca_bundle.crt
五、PHP相关注意事项
1. HTTPS检测代码段
在PHP中强制HTTPS访问:
```php
if ($_SERVER['HTTPS'] != "on") {
$url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
header("Location: $url");
exit;
}
2. cURL请求设置
当PHP代码需要发起HTTPS请求时:
```php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.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);
常见错误解决:
- `SSL certificate problem`:更新CA证书包 https://curl.se/docs/caextract.html
六、安全加固措施
1. SSL协议优化配置
编辑Apache的SSL配置文件(通常位于`/etc/apache2/mods-available/ssl.conf`):
```apacheconf
禁用不安全的协议和加密套件
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5:!RC4:!DES
SSLHonorCipherOrder on
开启HSTS强制HTTPS
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
测试安全性:https://www.ssllabs.com/ssltest/
2. HTTP自动跳转HTTPS
方法一:使用mod_rewrite
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
方法二:专用跳转VirtualHost
ServerName example.com
Redirect permanent / https://example.com/
七、常见故障排查指南
问题1:"NET::ERR_CERT_COMMON_NAME_INVALID"错误
原因:证书域名与实际访问域名不匹配
解决:确保CSR申请时的域名包含所有变体(如www和非www)
问题2:"ERR_SSL_VERSION_OR_CIPHER_MISMATCH"
原因:客户端不支持服务器配置的协议
解决:调整SSLProtocol设置兼容老设备
问题3:PHP Session跨HTTP和HTTPS丢失
解决方案:修改php.ini
session.cookie_secure = On
session.cookie_samesite = 'Lax'
记得每次修改后都要重启服务:
```bash
systemctl restart apache2 php-fpm
八、高级技巧
1. OCSP装订提升性能
在Apache配置中添加:
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
2.多域名SAN证书配置
当有多个子域名时,可以使用Subject Alternative Name (SAN)证书:
申请CSR时指定多个域名:
openssl req -new -key example.key \
-out example.csr \
-subj "/CN=example.com" \
-addext "subjectAltName=DNS:shop.example.com,DNS:api.example.com"
最后提醒大家定期检查证书有效期!建议设置自动续期:
Let's Encrypt自动续期命令:
certbot renew --dry-run
测试运行
certbot renew --quiet --post-hook "systemctl reload apache2"
可以添加到crontab每月执行一次:
0 */12 * */30 * certbot renew --quiet --post-hook "systemctl reload apache2"
TAG:apache php配置https证书,apache配置ssl证书,php中apache的配置,php配置ssl证书,apache配置php8