ssl新闻资讯

文档中心

Apache+PHP鐜閰嶇疆HTTPS璇佷功鐨勪繚濮嗙骇鏁欑▼

时间 : 2025-09-27 15:40:59浏览量 : 3

2Apache+PHP鐜閰嶇疆HTTPS璇佷功鐨勪繚濮嗙骇鏁欑▼

作为一名网络安全工程师,我经常遇到客户问:"为什么我的网站一定要用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