导读:2026 年的今天,HTTPS 早已不再是电商网站的"高级功能"——它是所有网站的标配。Google Chrome 从 2018 年开始就把所有 HTTP 网站标记为"不安全",搜索引擎也给予 HTTPS 网站明显的排名优势。本教程带你从零开始理解 SSL/TLS 是什么、如何申请免费证书、如何配置服务器、如何排查常见问题,最终让你的网站挂上小锁图标。
HTTP(HyperText Transfer Protocol)是 1991 年诞生的传输协议,它的最大问题是——所有数据都以 明文 传输。就像你把信写在明信片上寄出,沿途任何一个人都能看到内容。
HTTPS(HTTP Secure)则是在 HTTP 外层加了一个 "加密信封",由 SSL/TLS 协议负责加密解密。所有数据在传输前加密,只有接收者能解密。
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 默认端口 | 80 | 443 |
| 数据传输 | 明文 | 加密(TLS 1.3) |
| 浏览器地址栏 | 显示"不安全"警告 | 显示小锁图标 🔒 |
| 是否需要证书 | 不需要 | 必须有 SSL/TLS 证书 |
| SEO 影响 | 负面影响 | 正面加权 |
| 数据被篡改风险 | 极高 | 极低 |
| 密码输入框 | 浏览器警告"不安全" | 显示"安全连接" |
⏰ 紧急建议:如果你的网站目前仍然是 HTTP,请今天就改为 HTTPS。Let's Encrypt 提供完全免费的证书,整个过程不到 30 分钟就能完成。
SSL 证书有多个分类维度,主要看验证级别和可覆盖的域名数量。
| 类型 | 验证方法 | 浏览器显示 | 典型价格 | 适合场景 |
|---|---|---|---|---|
| DV(域名验证) | 仅验证域名所有权,通常通过邮件或 DNS 记录确认 | 小锁图标 | 免费 - $50/年 | 个人博客、小型企业站 |
| OV(组织验证) | 同时验证域名和企业的真实存在,审核员会打电话核实 | 小锁图标 + 点击可查看企业信息 | $80 - $300/年 | 中型企业、正规电商 |
| EV(扩展验证) | 最严格的审核,验证企业真实存在、合法运营、授权申请 | 小锁图标 + 地址栏显示企业名称 | $150 - $1000+/年 | 大型企业、银行、金融机构 |
| 类型 | 覆盖范围 | 示例 |
|---|---|---|
| 单域名证书 | 只保护一个完整域名 | 仅 www.example.com,但不保护 mail.example.com |
| 通配符证书 | 保护同一域名下的所有子域名(一个层级) | *.example.com = 保护 www、mail、api 等 |
| 多域名证书(MDC) | 一张证书保护多个完全不同的域名 | 同时保护 example.com、mysite.net、other.org |
| 多域名通配符 | 多域名 + 通配符的组合(最灵活) | 一张证书保护 *.siteA.com 和 *.siteB.com |
💡 新手建议:对于 90% 的个人站长和中小企业,Let's Encrypt 的免费 DV 证书就完全够用了。它提供与付费 DV 证书相同的加密强度,唯一的区别是有效期只有 90 天(但可以自动续期)。
Let's Encrypt 是由互联网安全研究组织(ISRG)运营的非盈利证书颁发机构。它提供的免费证书目前被全球超过 80% 的网站使用,是互联网 HTTPS 普及的最大功臣。
你可以选择多种方式来申请和管理 Let's Encrypt 证书:
Certbot 是由 EFF 开发的自动化工具,支持几乎所有主流 Linux 发行版和 Web 服务器。
# Ubuntu/Debian 系统安装 Certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
# 如果你用的是 Apache:
sudo apt install certbot python3-certbot-apache -y
# CentOS/RHEL 系统:
sudo dnf install certbot python3-certbot-nginx
# 申请并自动配置证书(以 Nginx 为例)
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
# 按提示回答问题:
# 1. 输入邮箱(用于接收安全通知和到期提醒)
# 2. 同意服务条款 (Y)
# 3. 是否愿意分享邮箱给 EFF (N)
# 4. 选择是否强制 HTTPS 重定向 (2 = 开启推荐)
成功后,Certbot 会告诉你:
Congratulations! You have successfully enabled HTTPS on
https://yourdomain.com
NEXT STEPS:
1. Test your SSL configuration at https://www.ssllabs.com/ssltest/
2. Certbot 会自动添加定时任务(cron),证书到期前 30 天自动续期
3. 验证自动续期是否正常工作:
sudo certbot renew --dry-run
acme.sh 是一个轻量级的 Shell 脚本,相比 Certbot 它不依赖 Python,支持更多 DNS 服务商(阿里云、腾讯云、Cloudflare 等几百家)。
# 安装 acme.sh
curl https://get.acme.sh | sh -s email=your@email.com
# 方式 1:使用 HTTP 文件验证(需要 80 端口)
~/.acme.sh/acme.sh --issue -d yourdomain.com -d www.yourdomain.com \
--webroot /home/user/yourdomain.com
# 方式 2:使用 DNS 验证(推荐,可申请通配符证书)
# 以 Cloudflare DNS 为例:
export CF_Key="你的 Cloudflare API Key"
export CF_Email="your@email.com"
~/.acme.sh/acme.sh --issue -d yourdomain.com -d "*.yourdomain.com" \
--dns dns_cf
# 证书签发后,安装到 Nginx 配置目录
~/.acme.sh/acme.sh --install-cert -d yourdomain.com \
--key-file /etc/nginx/ssl/yourdomain.com.key \
--fullchain-file /etc/nginx/ssl/yourdomain.com.crt \
--reloadcmd "sudo service nginx reload"
如果你的域名 DNS 解析放在 Cloudflare(免费版即可),可以直接在 Cloudflare 控制台开启"Universal SSL",无需配置服务器:
⚠️ 注意:Cloudflare 的"灵活"(Flexible)模式只加密用户到 Cloudflare 之间的流量,Cloudflare 到你源站之间仍然是 HTTP。如果你服务器里有敏感数据,建议使用"完全"(Full)模式并在源站也配置自签名证书。
对于使用共享主机(cPanel 面板)的用户,图形化操作更加直观:
https://你的域名:2083)。http:// 流量重定向到 https://。.htaccess 文件,添加强制 HTTPS 规则(见第 7 节)。如果你使用独立服务器或 VPS,需要手动修改 Web 服务器的配置文件。以下是两个主流服务器的标准 HTTPS 配置:
# 80 端口:所有 HTTP 请求 301 重定向到 HTTPS
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://yourdomain.com$request_uri;
}
# 443 端口:HTTPS 主配置
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# SSL 证书路径(Certbot 或 acme.sh 签发后放置的位置)
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
# 现代安全配置:只保留 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# 会话缓存(提升性能)
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP Stapling( stapling 提升握手速度)
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 10s;
# 网站根目录和默认文档
root /var/www/yourdomain.com;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP 处理(如果是 PHP 网站,如 WordPress)
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
# 静态资源缓存(提升性能)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
# 所有 HTTP 请求永久重定向到 HTTPS
Redirect permanent / https://yourdomain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
ServerAdmin webmaster@yourdomain.com
DocumentRoot /var/www/yourdomain.com
# 开启 SSL 引擎
SSLEngine on
# 证书文件路径
SSLCertificateFile /etc/letsencrypt/live/yourdomain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/yourdomain.com/privkey.pem
# 现代安全配置
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
# OCSP Stapling
SSLUseStapling On
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:stapling_cache(128000)
# 开启 HTTP/2
Protocols h2 http/1.1
# HSTS(1 年有效期,包含子域名,预加载)
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
# 目录权限
<Directory /var/www/yourdomain.com>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# 启用 gzip 压缩
AddOutputFilterByType DEFLATE text/plain text/html text/css application/json
</VirtualHost>
配置完成后,测试并重启服务:
# Nginx 测试与重启
sudo nginx -t && sudo systemctl reload nginx
# Apache 测试与重启
sudo apache2ctl configtest && sudo systemctl reload apache2
开启 HTTPS 后最常见的问题就是"混合内容"(Mixed Content)—— 即页面中同时包含加密(HTTPS)和非加密(HTTP)的资源链接。
http:// 的资源链接。// 方法 1:直接修改链接为 https(推荐)
// 把:
<img src="http://example.com/logo.png">
// 改为:
<img src="https://example.com/logo.png">
// 方法 2:使用协议相对 URL(不推荐,但可快速修复)
// 把:
<script src="http://cdn.example.com/jquery.min.js"></script>
// 改为:
<script src="//cdn.example.com/jquery.min.js"></script>
// 注意:这种方式会继承当前页面协议。但如果资源是第三方的,
// 需要确认对方是否也支持 HTTPS
// 方法 3:在 HTML 中添加 Content-Security-Policy
// 放在 <head> 中,浏览器会自动把所有 http 请求升级为 https
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
// 方法 4:在 Nginx 响应头中添加
add_header Content-Security-Policy "upgrade-insecure-requests; default-src https:" always;
💡 WordPress 用户的快捷修复:安装并启用 "Really Simple SSL" 插件,它会自动检测并替换页面中所有的 HTTP 资源为 HTTPS,同时配置 301 重定向。
"301 永久重定向" 告诉搜索引擎:"这个页面已经永久搬到新地址了,请把排名转移过来。" 这是 SEO 损失最小的方式。
server {
listen 80;
listen [::]:80;
server_name yourdomain.com www.yourdomain.com;
# 方式 1:简单写法(推荐)
return 301 https://yourdomain.com$request_uri;
# 方式 2:如果要同时统一到不带 www 的版本
# return 301 https://yourdomain.com$request_uri;
}
# HTTPS 服务中,把 www 版本统一到主域名(可选)
server {
listen 443 ssl http2;
server_name www.yourdomain.com;
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
return 301 https://yourdomain.com$request_uri;
}
RewriteEngine On
# 强制 HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://yourdomain.com/$1 [R=301,L]
# 同时去掉 www(可选)
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1$request_uri [R=301,L]
# 注意:确保 .htaccess 文件位于网站根目录
# 且 Apache 已启用 mod_rewrite 模块
https:// 开头。❌ 常见错误:使用 302 临时重定向而不是 301 永久重定向。302 意味着"这个页面临时在那里,很快会回来",搜索引擎不会把排名权重转移过去。一定要确认使用 301 而不是 302。
访问以下地址,检查是否都最终跳转到 https://yourdomain.com:
http://yourdomain.comhttp://www.yourdomain.comhttps://www.yourdomain.com(如果你选择主域是不带 www 的)也可以使用在线工具 https://httpstatus.io/ 来确认返回的是 301 状态码而不是 302。
HSTS(HTTP Strict Transport Security) 是一项安全策略,它告诉浏览器:"未来一段时间内,只能用 HTTPS 访问我。" 这可以避免用户被降级攻击(在 301 重定向之前被攻击者拦截为 HTTP)。
server {
listen 443 ssl http2;
server_name yourdomain.com;
# 基础 HSTS:告诉浏览器 1 年内只通过 HTTPS 访问
add_header Strict-Transport-Security "max-age=31536000" always;
# 推荐的完整 HSTS:包含子域名 + 允许被加入浏览器预加载列表
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 其他 SSL 配置...
}
# 在 VirtualHost 或 .htaccess 中添加:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
| 参数 | 含义 |
|---|---|
max-age=31536000 | 浏览器记住这个规则的秒数(31536000 秒 = 1 年)。 |
includeSubDomains | 将此规则应用于所有子域名(mail.yourdomain.com、api.yourdomain.com 等)。可选。 |
preload | 表示你愿意把你的域名加入浏览器的 HSTS 预加载列表。可选,且需要提交申请。 |
⚠️ HSTS 警告:一旦开启 HSTS 并设置了较长的 max-age,你的用户在一段时间内将无法访问 HTTP 版本的网站。在确保 HTTPS 配置稳定之前,建议先用较短的 max-age(如 600 秒)测试几天。确认没问题后再逐步增加到更长时间。
Qualys SSL Labs提供业界最权威的 SSL/TLS 安全测试工具,免费使用:
https://www.ssllabs.com/ssltest/analyze.html?d=yourdomain.com
把这些配置添加到你的 Nginx/Apache 中,就大概率能拿到 A+:
| 配置项 | 推荐值 |
|---|---|
| TLS 协议版本 | 只保留 TLS 1.2 和 TLS 1.3(禁用 SSLv3、TLS 1.0、TLS 1.1) |
| 加密套件 | 只保留前向保密(PFS)的 ECDHE 套件 |
| 证书密钥 | RSA ≥ 2048 位,或 ECDSA ≥ 256 位 |
| HSTS | max-age ≥ 31536000 秒(1 年) |
| OCSP Stapling | 开启 |
| 会话恢复 | 启用 SSL 会话缓存 |
| HTTP/2 支持 | 开启 |
| 混合内容 | 页面中不能有任何 http:// 资源 |
| 证书链 | 完整且正确(浏览器不提示"缺少中间证书") |
server {
listen 443 ssl http2;
server_name yourdomain.com;
# SSL 基础
ssl_certificate /etc/nginx/ssl/yourdomain.com.crt;
ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key;
# 协议:只保留安全的 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# 加密套件:按优先级排序,只保留前向保密的
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
# ECDH 曲线
ssl_ecdh_curve X25519:prime256v1:secp384r1;
# 会话缓存
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
resolver_timeout 10s;
# 安全响应头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy no-referrer-when-downgrade;
add_header Content-Security-Policy "upgrade-insecure-requests";
# 其他配置...
}
SSL 证书到期后如果不续期,浏览器会显示大红色的安全警告,访客会被吓跑。特别是 Let's Encrypt 只有 90 天有效期,到期监控必不可少。
好消息:Certbot 在安装时会自动添加 cron 定时任务(通常在 /etc/cron.d/certbot),每天运行两次检查证书是否需要续期。你可以手动测试一次:
# 测试自动续期是否正常工作
sudo certbot renew --dry-run
# 正常输出应该包含:
Congratulations, all simulated renewals succeeded!
# 查看 certbot 定时器状态(systemd 系统)
sudo systemctl list-timers certbot.timer
# 手动触发一次真正的续期(测试)
sudo certbot renew --force-renewal
acme.sh 同样在安装时会自动创建 cron 任务:
# 查看 cron 任务
crontab -l
# 应该能看到类似:
# 50 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
# 手动测试续期
~/.acme.sh/acme.sh --renew-all --dry-run
即使有自动续期,也建议配置外部监控作为"最后一道防线":
betterstack.com,免费版支持证书到期提醒 + 邮件/短信/电话告警。uptimerobot.com,免费版可以设置 SSL 到期前 30、14、7 天提醒。statuscake.com,类似功能。# 查看本地证书文件的有效期
openssl x509 -in /etc/nginx/ssl/yourdomain.com.crt -noout -dates
# 查看线上网站的证书有效期(最准确,检查服务器实际在用什么)
echo | openssl s_client -servername yourdomain.com -connect yourdomain.com:443 2>/dev/null | openssl x509 -noout -dates
# 输出示例:
notBefore=Jun 15 00:00:00 2026 GMT
notAfter=Sep 13 23:59:59 2026 GMT
# 即 2026 年 6 月 15 日签发,9 月 13 日到期(90 天有效期)
加密强度完全相同。区别在于:① 验证级别(付费的 OV/EV 提供企业身份验证,在证书详情中显示公司名称);② 保修金额(付费证书通常附带 $10万 - $175万 的 SSL 保险,如因证书漏洞导致数据泄露可申请赔偿);③ 客服支持(付费证书有人工支持);④ 浏览器信任等级相同——DV 证书在现代浏览器中显示的小锁图标与 EV 相同。对于 99% 的中小网站,Let's Encrypt 免费证书已经足够。
① 紧急:立即续期——Certbot 用户运行 sudo certbot renew --force-renewal;acme.sh 用户运行 acme.sh --renew-all。② 验证是否成功:刷新浏览器查看小锁图标,或运行 openssl 命令查看证书截止日期。③ 分析原因:为什么自动续期失败了?检查 cron 服务是否运行、DNS 记录是否变更、服务器 80/443 端口是否关闭。④ 设置外部监控(见第 10 节),确保下次到期前能收到提醒。
实际上 TLS 1.3 的握手速度已经非常快,加上 HTTP/2 的多路复用,合理配置的 HTTPS 网站甚至比 HTTP 更快。如果你感觉变慢,检查:① 是否开启了 HTTP/2(Nginx 需要在 listen 后添加 http2);② 是否启用了 SSL 会话缓存和会话票证(避免每次握手重新协商);③ 是否开启了 OCSP Stapling;④ 是否部署了 CDN(CDN 边缘节点可以大幅加速 HTTPS 握手);⑤ 是否有不必要的资源重定向链。
这是最常见的 SSL 警告,原因通常有:① 证书已过期—— 重新签发即可;② 证书域名不匹配—— 证书是给 www.yourdomain.com 签发的,但你访问的是 yourdomain.com 或其他子域,需要重新申请包含所有子域名的证书;③ 缺少中间证书—— 浏览器不信任你的证书签发者,需要在服务器配置中提供完整的证书链(fullchain.pem 而不是 cert.pem);④ 自签名证书—— 用于测试环境的自签证书不会被浏览器信任;⑤ 系统时间错误—— 用户电脑的时间日期严重错误也会导致证书被判断为"未生效"或"已过期"。
不一定。你可以选择:① 多域名证书(SAN)—— 一张证书保护多个完全不同的域名,Let's Encrypt 每张证书最多可以包含 100 个域名;② 通配符证书—— *.yourdomain.com 可以保护同一主域的所有子域名;③ 多域名通配符—— 最灵活但通常只在付费证书中提供。实际操作中,建议按站点分别申请,出问题时更容易隔离排查。
会,而且是正面影响。Google 在 2014 年正式宣布 HTTPS 作为排名因素之一。实际影响中,更重要的是间接影响:HTTP 网站在 Chrome 中会显示"不安全"警告,降低用户点击率和停留时间;而 HTTPS 网站用户信任度更高,点击率更高、跳出率更低。同时,如果不做 301 重定向,HTTP 和 HTTPS 两个版本会被搜索引擎认为是重复内容,分散权重。
在申请时,建议同时包含主域名(yourdomain.com)和 www 子域名(www.yourdomain.com)。这在 Certbot 和 cPanel 中都是默认支持的。然后通过 301 重定向把其中一个版本统一到另一个版本(选择带 www 或不带 www 作为标准地址,两者任选其一,但全站要统一)。
Let's Encrypt 是由 Mozilla、Google、Cisco、EFF 等大型科技公司赞助的非营利项目,资金充足,运营稳定。自 2015 年推出以来,已签发超过 3 亿张活跃证书,保护了互联网上 80% 的网站。它的使命就是"让所有网站都用上加密",所以不需要担心会停止免费服务。
恭喜你完成了 HTTPS 的学习。现在把理论变为实践:
certspotter.com 提供免费服务。← 回到首页📚 官方文档和工具:Certbot 官网
certbot.eff.org;Let's Encrypt 官网letsencrypt.org;SSL Labs 测试ssllabs.com/ssltest;HSTS 预加载列表hstspreload.org。