15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
10.10.2024

如何在域名上安装 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-apache

Debian / Ubuntu(Nginx):

sudo apt update && sudo apt install -y certbot python3-certbot-nginx

RHEL / AlmaLinux / Rocky Linux(Apache):

sudo dnf install -y epel-release
sudo dnf install -y certbot python3-certbot-apache

RHEL / 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.com

Nginx:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot默认执行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 nginx

OCSP 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)中的混合内容,并对被动资源(图片)生成控制台警告。

修复混合内容的方法:

  1. 将CMS或HTML中所有硬编码的 http:// URL更新为 https:// 或协议相对路径 //
  2. 添加带有 upgrade-insecure-requests内容安全策略头部作为临时通用方案:
add_header Content-Security-Policy "upgrade-insecure-requests" always;
  1. 使用浏览器开发者工具(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 | md5sumopenssl 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 apache2systemctl reload nginx)。重载会应用新证书而不中断现有连接,这与完全重启不同。

安装SSL证书后会自动将HTTP重定向到HTTPS吗?

不会。安装证书仅启用HTTPS。HTTP到HTTPS的重定向必须在虚拟主机或server块中单独配置。Certbot的 --apache--nginx 插件会在安装过程中提示自动配置此重定向。对于手动安装,请在80端口的server块中添加明确的 Redirect permanent(Apache)或 return 301(Nginx)指令。

15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用