HTTP协议以明文传输数据,账号密码、Cookie等敏感信息在链路中裸奔,中间人可以轻松截获甚至篡改内容。给Apache加上SSL证书、切换到HTTPS,是解决这一问题的标准做法。整个流程可以拆成三步:选证书、申请证书、部署到Apache并验证。下面把每一步的细节和坑都讲清楚。

一、先搞清楚SSL证书怎么选
证书本质上是CA机构对域名所有权的背书,按验证等级分为DV(域名验证)、OV(组织验证)和EV(扩展验证)三类。个人网站和中小型企业站用DV证书完全够用,签发速度快,几分钟就能完成;OV和EV证书需要审核企业资质,价格更高,主要用在金融、电商等对信任要求高的场景。
从获取渠道看,常见的有三条路。第一条是自签名证书,用openssl命令自己生成,不花钱但浏览器不信任,只适合内部测试环境。第二条是Let's Encrypt免费证书,目前是个人站长的主流选择,有效期90天,支持自动续期,通过Certbot工具申请非常方便。第三条是云厂商或商业CA的付费证书,阿里云、腾讯云都提供免费版DV证书(每年20张额度),商业证书则有多域名、通配符等更灵活的类型。
如果你的站点有多个子域名,比如api.ippipp.com和www.ippipp.com,建议直接申请通配符证书(Wildcard),一张证书覆盖所有子域名,管理起来省心得多。Let's Encrypt的通配符证书要求通过DNS方式验证域名所有权,稍后会讲到。
二、用Certbot申请Let's Encrypt免费证书
Certbot是官方推荐的申请工具,以CentOS和Ubuntu为例,安装方式略有不同。Ubuntu下可以直接用apt安装:
sudo apt update sudo apt install certbot python3-certbot-apache -y
如果是CentOS,需要先启用EPEL源:
sudo yum install epel-release -y sudo yum install certbot python3-certbot-apache -y
申请证书最简单的方式是让Certbot自动读取Apache配置:
# 自动发现虚拟主机并申请证书,同时自动修改配置 sudo certbot --apache -d ippipp.com -d www.ippipp.com # 只申请证书,不改动Apache配置,适合手动部署 sudo certbot certonly --apache -d ippipp.com
如果Certbot的Apache插件因为配置复杂识别不了站点,可以退回到webroot模式,它会往网站根目录放一个验证文件:
sudo certbot certonly --webroot -w /var/www/html -d ippipp.com
申请成功后,证书文件会落在/etc/letsencrypt/live/ippipp.com/目录下,其中fullchain.pem是完整证书链,privkey.pem是私钥,Apache配置里要用的就是这两个文件。通配符证书则必须走DNS验证,把Certbot给出的TXT记录添加到域名解析后台即可:
sudo certbot certonly --manual --preferred-challenges dns -d "*.ippipp.com" -d ippipp.com
由于Let's Encrypt证书只有90天有效期,别指望手动记得续期,直接配置定时任务:
sudo crontab -e # 每天凌晨2点检查续期,到期前30天内自动完成 0 2 * * * /usr/bin/certbot renew --quiet
三、Apache端部署与HTTPS配置
拿到证书后,第一步是确认Apache的SSL模块已启用。Ubuntu下执行sudo a2enmod ssl,CentOS下检查/etc/httpd/conf.modules.d/00-ssl.conf里mod_ssl的加载语句是否被注释掉。同时建议开启mod_headers,后面配置HSTS会用到。
接着在虚拟主机配置中监听443端口。以Ubuntu为例,在/etc/apache2/sites-available/下新建配置文件:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName ippipp.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/ippipp.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ippipp.com/privkey.pem
# 推荐的TLS协议与加密套件
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite HIGH:!aNULL:!MD5
# HSTS,强制浏览器后续只用HTTPS访问
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000"
</IfModule>
</VirtualHost>
</IfModule>写完配置先别急着重启,用sudo apachectl configtest检查语法,输出Syntax OK后再执行sudo systemctl reload apache2(CentOS上是httpd)平滑加载。别忘了防火墙放行443端口:sudo ufw allow 443/tcp或firewall-cmd --permanent --add-service=https。
四、强制HTTP跳转与收尾检查
证书部署完,80端口的HTTP访问依然可用,需要做301跳转把所有流量导向HTTPS。在80端口的虚拟主机里加一条Rewrite规则:
<VirtualHost *:80>
ServerName ippipp.com
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>上线后要验证两件事。一是证书链是否完整,用浏览器开发者工具查看,或访问SSL Labs的在线检测工具评分,A级别说明配置合格。二是页面里是否残留HTTP资源,比如图片、脚本还走http协议,浏览器会标记混合内容并拦截其中一部分请求,控制台里会有明确提示,把这些资源地址改成https或相对协议即可。
几个高频报错也顺便列一下:SSLCertificateKeyFile: file does not exist多半是路径拼错或权限问题,私钥目录默认只有root可读,Apache主进程需要能读到它;浏览器提示证书链不完整,说明SSLCertificateFile用的不是fullchain而是单独的cert文件;配置了TLSv1.3后老客户端连不上,检查SSLProtocol里是否误禁了TLSv1.2。按这套流程走下来,网站地址栏的小锁图标就能稳定亮起来了。
Apache SSL证书HTTPS配置Let's Encrypt修改时间:2026-09-12 18:58:38