如何在域名上安装 SSL 证书
SSL证书(安全套接层 / TLS)是由受信任的证书颁发机构(CA)颁发的加密凭证,用于验证服务器身份并在服务器与客户端浏览器之间建立加密通道。正确安装后,它会将您的网站从 http:// 升级为 https://,激活浏览器挂锁图标,并防止传输数据遭受中间人拦截。
在SEO方面,Google自2014年起已将HTTPS列为确认的排名信号。对于用户而言,缺失或配置错误的证书会触发浏览器安全警告,严重影响转化率。无论您管理的是单个落地页还是多域名基础设施,正确配置SSL并持续维护都是不可或缺的。
开始前的准备工作
在修改任何配置文件之前,请确认以下条件已满足:
- 已注册的域名,并已将其指向服务器的IP地址,且DNS已完全传播。您可以通过域名注册注册或转入域名。
- 来自CA的SSL证书包,通常包含以下内容:
certificate.crt— 您的主签名证书private.key— 与CSR一同生成的私钥ca_bundle.crt— 中间CA链(有时称为链文件)- 服务器或控制面板访问权限 — cPanel/Plesk凭据,或服务器的SSH root/sudo访问权限。
- Web服务器软件 — Apache或Nginx,已运行并为您的域名完成配置。
- 开放443端口 — 在安装任何内容之前,请确认防火墙允许443端口的入站TCP连接。
如果您使用的是VPS托管环境,您将拥有完整的root访问权限,可以使用以下三种方法中的任意一种。共享主机用户通常仅限于使用cPanel方法。
选择合适的SSL证书类型
并非所有证书都是等价的。选择错误的类型会浪费资金或留下覆盖漏洞。
| 证书类型 | 验证级别 | 签发时间 | 浏览器挂锁 | 适用场景 |
|---|---|---|---|---|
| — | — | — | — | — |
| DV(域名验证) | 仅验证域名控制权 | 数分钟 | 是 | 博客、开发环境、小型网站 |
| OV(组织验证) | 域名 + 组织身份 | 1–3天 | 是 | 企业网站、SaaS平台 |
| EV(扩展验证) | 完整法律实体审查 | 3–7天 | 是(部分浏览器显示组织名称) | 电子商务、银行、高信任度门户 |
| 通配符(`*.domain.com`) | DV或OV | 数分钟至数天 | 是 | 多子域名部署 |
| 多域名(SAN) | DV、OV或EV | 不定 | 是 | 单张证书覆盖多个不同域名 |
| Let’s Encrypt(免费DV) | 仅验证域名控制权 | 数秒 | 是 | 任何可公开访问的域名 |
对于生产环境的电子商务网站或任何处理支付卡数据的网站,强烈建议使用商业CA颁发的OV或EV证书。Let’s Encrypt DV证书完全受信任,适用于大多数使用场景,但不包含组织身份验证。
如果您需要OV、EV或通配符证书并希望获得专属支持,可直接通过SSL证书购买商业证书。
方法一:通过cPanel安装SSL证书
cPanel的图形界面是托管主机或共享虚拟主机用户最快捷的安装途径。如果您偏好cPanel管理的VPS环境,带cPanel的VPS可为您提供相同的界面以及完整的服务器控制权。
第一步:登录cPanel
访问您的cPanel登录地址:
https://yourdomain.com:2083使用您的主机凭据进行身份验证。
第二步:进入SSL/TLS管理器
在cPanel控制台的安全部分,点击SSL/TLS,然后在”为您的网站安装和管理SSL(HTTPS)”标题下选择管理SSL网站。
第三步:选择目标域名
使用域名下拉菜单选择您要保护的域名。如果域名未出现,请确认它已作为附加域名或主域名添加到cPanel中。
第四步:粘贴证书组件
用纯文本编辑器(非Word)打开每个证书文件,并将内容粘贴到对应字段中:
- 证书(CRT):
certificate.crt的内容 - 私钥(KEY):
private.key的内容。如果您在cPanel内生成了CSR,该字段将从cPanel的密钥库中自动填充。 - 证书颁发机构包(CABUNDLE):
ca_bundle.crt的内容。省略此字段是导致移动设备和旧版浏览器出现”不受信任的证书”错误的最常见原因之一,因为浏览器无法构建通向受信任根证书的链。
第五步:安装并验证
点击安装证书。cPanel在提交前会验证密钥与证书的匹配性。如果私钥与证书的公钥不匹配,cPanel将以明确的错误信息拒绝安装——请勿忽略此错误。
安装完成后,访问 https://yourdomain.com 并确认挂锁图标已显示。如果 www 子域名正在使用,还需测试 https://www.yourdomain.com。
cPanel常见陷阱:AutoSSL(cPanel内置的Let’s Encrypt集成)可能在下次续期周期时覆盖手动安装的证书。如果您安装了商业证书,请在cPanel > SSL/TLS状态下为该域名禁用AutoSSL,以防止意外替换。
方法二:使用Let’s Encrypt和Certbot自动安装
Certbot是Let’s Encrypt的参考ACME客户端。它可自动处理CSR生成、域名验证、证书获取、Web服务器配置和续期等全部流程。这是直接管理Linux服务器的正确方式。
第一步:通过SSH连接到服务器
ssh username@your-server-ip第二步:安装Certbot
Debian / Ubuntu(Apache):
sudo apt update && sudo apt install -y certbot python3-certbot-apacheDebian / Ubuntu(Nginx):
sudo apt update && sudo apt install -y certbot python3-certbot-nginxRHEL / AlmaLinux / Rocky Linux(Apache):
sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-apacheRHEL / AlmaLinux / Rocky Linux(Nginx):
sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-nginx第三步:获取并安装证书
Apache:
sudo certbot --apache -d yourdomain.com -d www.yourdomain.comNginx:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.comCertbot默认执行HTTP-01验证:它在您的Web根目录中放置一个临时文件,并请求Let’s Encrypt的服务器通过80端口获取该文件。这意味着在运行命令之前,80端口必须开放,且DNS必须正确解析。
当系统提示时,选择将所有HTTP流量重定向到HTTPS的选项。这会在服务器配置中写入永久301重定向,这是SEO和安全性的正确做法。
第四步:验证自动续期
Let’s Encrypt证书在90天后过期。Certbot会安装一个systemd定时器(或旧系统上的cron任务),在证书到期前30天内每天尝试续期两次。在不实际续期的情况下测试续期逻辑:
sudo certbot renew --dry-run成功的演练确认续期流程正常运行。使用以下命令检查定时器状态:
systemctl status certbot.timer边缘情况——通配符证书的DNS-01验证:HTTP-01验证无法验证通配符域名(*.yourdomain.com)。对于通配符证书,请使用DNS-01验证,该验证要求您在DNS区域中创建 _acme-challenge TXT记录:
sudo certbot certonly --manual --preferred-challenges dns -d "*.yourdomain.com" -d yourdomain.com按照提示添加TXT记录,等待DNS传播完成后,按Enter键完成验证。
方法三:通过SSH手动安装SSL(Apache和Nginx)
手动安装让您能够精确控制证书存放位置、加密套件和虚拟主机配置。这是需要执行特定TLS策略的生产服务器的首选方式。
第一步:将证书文件上传到服务器
使用 scp 从本地机器传输文件:
scp certificate.crt private.key ca_bundle.crt username@your-server-ip:/tmp/然后将其移动到安全的、不可通过Web访问的目录:
sudo mkdir -p /etc/ssl/yourdomain
sudo mv /tmp/certificate.crt /etc/ssl/yourdomain/
sudo mv /tmp/private.key /etc/ssl/yourdomain/
sudo mv /tmp/ca_bundle.crt /etc/ssl/yourdomain/
sudo chmod 600 /etc/ssl/yourdomain/private.key
sudo chmod 644 /etc/ssl/yourdomain/certificate.crt /etc/ssl/yourdomain/ca_bundle.crt重要安全提示:私钥绝不能对所有用户可读。chmod 600 权限将其限制为仅root用户可访问。在Apache或Nginx以非root用户(如 www-data)运行的系统上,服务在启动时仍以root身份读取密钥,然后再降低权限——因此由root拥有的 600 权限设置是正确的。
第二步(a):配置Apache
编辑您域名的虚拟主机配置文件:
sudo nano /etc/apache2/sites-available/yourdomain.com.conf添加或修改SSL虚拟主机块:
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
Redirect permanent / https://yourdomain.com/
</VirtualHost>
<VirtualHost *:443>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
SSLEngine on
SSLCertificateFile /etc/ssl/yourdomain/certificate.crt
SSLCertificateKeyFile /etc/ssl/yourdomain/private.key
SSLCertificateChainFile /etc/ssl/yourdomain/ca_bundle.crt
# Modern TLS hardening
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
DocumentRoot /var/www/yourdomain
</VirtualHost>启用SSL模块和站点,然后重启Apache:
sudo a2enmod ssl headers
sudo a2ensite yourdomain.com.conf
sudo apache2ctl configtest
sudo systemctl restart apache2重启前务必运行 apache2ctl configtest。配置文件中的语法错误将导致整个Web服务器宕机。
第二步(b):配置Nginx
编辑您域名的server块:
sudo nano /etc/nginx/sites-available/yourdomain.com添加以下配置:
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://yourdomain.com$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/ssl/yourdomain/certificate.crt;
ssl_certificate_key /etc/ssl/yourdomain/private.key;
ssl_trusted_certificate /etc/ssl/yourdomain/ca_bundle.crt;
# Modern TLS hardening
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
root /var/www/yourdomain;
index index.html index.php;
}启用站点并测试:
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxOCSP Stapling说明:若不启用stapling,浏览器在每次TLS握手时都必须联系CA的OCSP响应服务器以检查证书是否已被吊销,这会增加延迟并将浏览数据泄露给CA。启用 ssl_stapling on 后,Nginx会缓存OCSP响应并直接提供给客户端,从而消除这一往返过程。
TLS加固:默认配置的不足之处
使用默认设置安装的证书是安全的,但并未经过加固。下表总结了将SSL Labs评级从合格提升至A+所需的额外指令:
| 加固指令 | Apache指令 | Nginx指令 | 用途 |
|---|---|---|---|
| — | — | — | — |
| 禁用TLS 1.0 / 1.1 | `SSLProtocol all -TLSv1 -TLSv1.1` | `ssl_protocols TLSv1.2 TLSv1.3` | 消除已弃用协议的漏洞 |
| HSTS头部 | `Header always set Strict-Transport-Security` | `add_header Strict-Transport-Security` | 在浏览器层面强制使用HTTPS,防止SSL剥离攻击 |
| OCSP Stapling | `SSLUseStapling on` | `ssl_stapling on` | 降低握手延迟,提升隐私保护 |
| 禁用会话票据 | `SSLSessionTickets off` | `ssl_session_tickets off` | 防止前向保密性降级 |
| 强加密套件 | `SSLCipherSuite ECDHE-…` | `ssl_ciphers ECDHE-…` | 强制使用AEAD加密,消除RC4/3DES |
| HTTP/2 | `Protocols h2 http/1.1` | `listen 443 ssl http2` | TLS上的性能提升 |
验证和测试SSL安装
在从外部视角验证结果之前,安装尚未完成。
浏览器验证
访问 https://yourdomain.com。挂锁图标确认证书有效且受信任。点击挂锁并检查证书详情:验证通用名称或主题备用名称与您的域名匹配,并检查到期日期。
SSL Labs服务器测试
访问SSL Labs并输入您的域名。报告将您的TLS配置从F到A+进行评级,并标记具体问题:弱加密套件、缺失链证书、缺少HSTS以及协议支持情况。获得A+评级需要设置较长 max-age 的HSTS,且不支持TLS 1.0或1.1。
使用OpenSSL进行命令行验证
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com此命令输出完整的证书链、协商的加密套件和TLS版本。在输出末尾查找 Verify return code: 0 (ok)。任何非零返回码均表示存在链或信任问题。
直接检查证书到期日期:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -dates检查混合内容
启用HTTPS后,混合内容是最常见的残留问题。当HTTPS页面通过HTTP加载资源(图片、脚本、样式表、iframe)时就会出现此问题。现代浏览器会完全阻止活跃资源(脚本、iframe)中的混合内容,并对被动资源(图片)生成控制台警告。
修复混合内容的方法:
- 将CMS或HTML中所有硬编码的
http://URL更新为https://或协议相对路径//。 - 添加带有
upgrade-insecure-requests的内容安全策略头部作为临时通用方案:
add_header Content-Security-Policy "upgrade-insecure-requests" always;- 使用浏览器开发者工具(F12 > 控制台)识别具体的问题资源。
证书续期与生命周期管理
| 证书来源 | 默认有效期 | 续期方式 | 自动化程度 |
|---|---|---|---|
| — | — | — | — |
| Let’s Encrypt(Certbot) | 90天 | 通过systemd定时器执行 `certbot renew` | 全自动 |
| 商业CA(cPanel) | 1–2年 | 手动重新签发并重新安装 | 手动或脚本化 |
| 商业CA(SSH) | 1–2年 | 替换文件,重载Web服务器 | 可通过cron脚本化 |
| 内部CA / 自签名 | 自定义 | 手动 | 手动 |
对于手动管理的商业证书,请在到期前30天设置日历提醒。过期的证书比没有证书更糟糕——浏览器会显示全页拦截错误,用户很难绕过。
如果您在独立服务器上运行多个域名或高流量应用,建议考虑实施集中式证书管理方案,例如cert-manager(Kubernetes)、Vault PKI或通配符证书,以减少子域名续期的管理开销。
决策矩阵:选择哪种安装方法
| 场景 | 推荐方法 |
|---|---|
| — | — |
| 共享主机,无SSH访问权限 | cPanel SSL/TLS管理器 |
| VPS或独立服务器,需要免费证书 | Certbot(Let’s Encrypt) |
| VPS或独立服务器,商业OV/EV证书 | SSH手动安装 |
| 通配符证书(`*.domain.com`) | SSH手动安装 + 通过Certbot进行DNS-01验证 |
| 多域名SAN证书 | SSH手动安装 |
| 无技术经验,托管主机 | cPanel AutoSSL或主机商的一键SSL |
技术要点核查清单
- 在安装任何证书之前,确认防火墙已开放443端口。
- 安装前务必验证私钥与证书匹配:
openssl x509 -noout -modulus -in certificate.crt | md5sum和openssl rsa -noout -modulus -in private.key | md5sum必须产生相同的哈希值。 - 包含完整的中间链(
ca_bundle.crt)——省略它会导致移动浏览器出现信任失败,即使桌面版Chrome显示挂锁图标也不例外。 - 对私钥文件设置
chmod 600权限;切勿将其放置在可通过Web访问的目录中。 - 在Web服务器配置中禁用TLS 1.0和TLS 1.1——这些协议已被弃用且存在安全漏洞。
- 仅在确认所有子域名也提供HTTPS服务后,再启用带
includeSubDomains的HSTS。 - 在初始Certbot设置完成后运行
certbot renew --dry-run,以确认续期流程正常运行。 - 每次安装或配置变更后,使用SSL Labs进行测试。
- 切换到HTTPS后立即检查混合内容——它会悄无声息地破坏功能。
- 对于Let’s Encrypt通配符证书,请使用DNS-01验证,而非HTTP-01。
常见问题解答
SSL证书和TLS证书有什么区别?
SSL(安全套接层)是已于1999年被弃用的旧版协议。其继任者TLS(传输层安全)才是所有现代HTTPS连接实际使用的协议。”SSL证书”这一术语作为行业惯用语沿用至今,但今天颁发的所有证书均通过TLS 1.2或TLS 1.3运行。
为什么我的SSL证书在Chrome上显示受信任,但在Android设备上不受信任?
这几乎总是由于缺少中间证书链。桌面版Chrome具有积极的证书获取机制(AIA获取),即使服务器未提供证书链也能重建。而Android的系统证书库则不具备此功能。请务必在服务器配置中包含 ca_bundle.crt 链文件。
我可以为尚未建立网站的域名安装SSL证书吗?
可以,但前提是该域名的DNS A记录已解析到服务器的IP地址。CA必须能够访问服务器以完成域名验证。如果DNS尚未传播完成,验证将会失败。
如何在不中断服务的情况下续期商业SSL证书?
在服务器上生成新的CSR,提交给CA,收到新的证书包后替换服务器上的证书文件,然后重载Web服务器(systemctl reload apache2 或 systemctl reload nginx)。重载会应用新证书而不中断现有连接,这与完全重启不同。
安装SSL证书后会自动将HTTP重定向到HTTPS吗?
不会。安装证书仅启用HTTPS。HTTP到HTTPS的重定向必须在虚拟主机或server块中单独配置。Certbot的 --apache 和 --nginx 插件会在安装过程中提示自动配置此重定向。对于手动安装,请在80端口的server块中添加明确的 Redirect permanent(Apache)或 return 301(Nginx)指令。
