证书颁发与部署

证书颁发与部署

4 min read

技术教程

Ubuntu 24 + Apache + WordPress
PEM 格式 SSL 证书部署指南

本文是将证书颁发机构(CA)管理控制台颁发的 PEM 格式 SSL 证书,
部署到 Ubuntu 24 + Apache + WordPress 环境中的通用教程。

Ubuntu 24
Apache
WordPress
PEM SSL

免责声明 #

本文是技术教程,介绍在 Ubuntu 24 + Apache + WordPress 环境中部署 SSL 证书(PEM 格式)的一般流程。

内容基于撰写时的最新信息,但根据具体环境、配置、证书类型、CA 规范、中间件版本等因素的不同,操作流程和配置方法可能有所差异。

概述 #

本文是将 PEM 格式 SSL 证书
(即 CA 管理控制台文本框中显示的类型)
部署到 Ubuntu 24 + Apache + WordPress 站点的通用教程。

无论证书是 EV / OV / DV 类型,服务器部署的基本流程都是相同的。

前提条件 #

  • 操作系统:Ubuntu 24(拥有 root 或 sudo 权限)
  • Web 服务:Apache(apache2)正在运行
  • CMS:WordPress 正在 Apache 下运行
  • 证书:服务器证书已由 CA 颁发
  • 中间证书:CA 提供的中间证书(CA Bundle)已就绪
  • 重要:持有生成 CSR 时创建的私钥(若丢失需重新颁发)

CA 控制台显示的证书格式(示例) #

在 CA 管理控制台中,可能会在文本框中显示以下代码块(PEM)。请从头到尾完整复制该代码块并保存到服务器上。

-----BEGIN CERTIFICATE-----
(long string of alphanumeric characters)
-----END CERTIFICATE-----

注意

  • 复制时请包含 BEGIN/END 行。
  • 即使换行被破坏配置也能正常工作,但最安全的做法是按显示内容原样粘贴。
  • 请勿粘贴私钥(BEGIN PRIVATE KEY)。

整体部署流程 #

  1. 将证书文件保存到指定位置
  2. 准备中间证书(证书链)
  3. 创建完整证书链 fullchain(服务器证书 + 中间证书)
  4. 验证私钥与证书是否匹配
  5. 配置 Apache HTTPS 虚拟主机(包括 80 → 443 重定向)
  6. 重新加载 Apache,并处理 WordPress 的 URL / 混合内容问题
  7. 验证运行情况(证书链、重定向、证书信息)

步骤 1放置证书文件(服务器证书) #

以下是 Ubuntu 上常见的放置示例(请根据您的运维策略进行调整)。

保存位置(示例) #

  • 私钥(已有):/etc/ssl/private/example.com.key
  • 服务器证书:/etc/ssl/certs/example.com.crt
  • 中间证书:/etc/ssl/certs/intermediate-ca.pem
  • 完整证书链:/etc/ssl/certs/example.com.fullchain.pem

创建目录并设置权限 #

sudo mkdir -p /etc/ssl/private /etc/ssl/certs
sudo chmod 700 /etc/ssl/private

将 CA 控制台的证书(PEM)保存为文件 #

从 CA 控制台文本框中复制证书代码块,并保存到 /etc/ssl/certs/example.com.crt。

sudo nano /etc/ssl/certs/example.com.crt
sudo chmod 644 /etc/ssl/certs/example.com.crt

本地自动保存的示例:

sudo tee /etc/ssl/certs/example.com.crt >/dev/null <<'EOF'
-----BEGIN CERTIFICATE-----
(paste certificate content here)
-----END CERTIFICATE-----
EOF
sudo chmod 644 /etc/ssl/certs/example.com.crt

步骤 2准备中间证书(CA Bundle / Intermediate) #

许多 CA 会提供与服务器证书分开的中间证书(或 CA Bundle)。若没有该证书,部分设备可能会显示“不受信任”的提示。

保存中间证书(示例) #

将从 CA 获取的 PEM 格式中间证书(一个或多个)保存到以下位置:

sudo nano /etc/ssl/certs/intermediate-ca.pem
sudo chmod 644 /etc/ssl/certs/intermediate-ca.pem

存在多个中间证书时 #

如果 CA Bundle 中包含多个中间证书,请按照 CA 指定的顺序(通常朝向根证书的方向)将它们合并到同一个文件中。

步骤 3创建完整证书链 Fullchain(服务器证书 + 中间证书) #

在 Apache 中,通常的做法是将 fullchain(服务器证书 + 中间证书)指定为证书文件。

sudo cat /etc/ssl/certs/example.com.crt \
  /etc/ssl/certs/intermediate-ca.pem \
  | sudo tee /etc/ssl/certs/example.com.fullchain.pem >/dev/null

sudo chmod 644 /etc/ssl/certs/example.com.fullchain.pem

步骤 4验证私钥与证书是否匹配(重要) #

如果证书与私钥不匹配,即使完成 Apache 配置,HTTPS 也无法正常工作。请务必进行验证。

验证方法 A:RSA 密钥情形(比较 Modulus) #

openssl x509 -noout -modulus -in /etc/ssl/certs/example.com.crt | openssl md5
openssl rsa  -noout -modulus -in /etc/ssl/private/example.com.key | openssl md5

若两个 MD5 值相同,则表示匹配。

验证方法 B:不依赖密钥类型(比较公钥 SHA256) #

# Certificate → Public Key → SHA256
openssl x509 -in /etc/ssl/certs/example.com.crt -pubkey -noout \
  | openssl pkey -pubin -outform DER \
  | openssl sha256

# Private Key → Public Key → SHA256
openssl pkey -in /etc/ssl/private/example.com.key -pubout -outform DER \
  | openssl sha256

若两个 SHA256 值相同,则表示匹配。

若不匹配 #

  • 很可能 CSR 是使用不同的私钥创建的。
  • 若找不到正确的私钥,则必须在 CA 端重新颁发(Reissue),并使用正确的密钥重新创建 CSR。

步骤 5在 Apache 中启用 HTTPS #

启用所需模块 #

sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod rewrite
sudo systemctl reload apache2

确认 443 端口正在被监听 #

通常 /etc/apache2/ports.conf 中会包含 Listen 443。请按需确认。

步骤 6Apache 虚拟主机配置(443 + 80→443 重定向) #

此处以 example.com 为例,创建并部署站点配置文件。

创建站点配置文件(示例) #

sudo nano /etc/apache2/sites-available/example.com.conf

配置示例(以 WordPress 为前提) #

※ 请将代码中的 example.com 和 DocumentRoot 替换为您的实际环境。

<VirtualHost *:80>
    ServerName example.com

    # HTTP → HTTPS permanent redirect
    RewriteEngine On
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName example.com

    DocumentRoot /var/www/example.com/public

    # For WordPress (.htaccess operation case)
    <Directory /var/www/example.com/public>
        AllowOverride All
        Require all granted
    </Directory>

    SSLEngine on

    # Specify fullchain (server certificate + intermediate)
    SSLCertificateFile      /etc/ssl/certs/example.com.fullchain.pem
    SSLCertificateKeyFile   /etc/ssl/private/example.com.key

    # Recommended: Enable as needed (prioritize operation verification first)
    # Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    ErrorLog ${APACHE_LOG_DIR}/example.com-ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-ssl-access.log combined
</VirtualHost>
</IfModule>

启用该站点 #

sudo a2ensite example.com.conf

配置测试 → 重新加载 #

sudo apache2ctl configtest
sudo systemctl reload apache2

要检查哪些虚拟主机已启用:

sudo apache2ctl -S

步骤 7将 WordPress 切换为 HTTPS #

统一站点 URL 为 HTTPS #

  • WordPress 管理后台 → 设置 → 常规
  • 将“WordPress 地址(URL)”和“站点地址(URL)”均设置为 https://example.com

混合内容应对 #

  • 如果图片、CSS / JS 仍以 http:// 形式保留,会导致锁形图标消失。
  • 可通过数据库替换、主题设置、插件等方式统一为 https://(建议操作前先备份)。

步骤 8验证运行情况 #

HTTPS 连接(curl) #

curl -I https://example.com/
curl -I http://example.com/

预期结果:

  • https://example.com/ 返回 200 / 301 等正常响应
  • http://example.com/ 以 301 重定向到 https

证书链验证(openssl) #

echo | openssl s_client -connect example.com:443 -servername example.com -showcerts

浏览器验证 #

  • 未出现证书错误
  • 证书详情显示预期的颁发机构 / 有效期 / SAN 等信息

常见故障排查 #

证书明明正确却显示为“不受信任” #

  • 可能未提供中间证书(CA Bundle),或未包含在 fullchain 中。
  • 请确认 SSLCertificateFile 指向的是 fullchain。

Apache 启动 / 重新加载因 SSL 错误而失败 #

  • 可能是私钥路径不正确、权限不当,或密钥与证书不匹配。
  • 请重新执行“步骤 4”中的匹配验证。

发生重定向循环 #

  • 可能是 WordPress 端(siteurl / home)与 Apache 端(80 → 443)设置相互矛盾。
  • 若使用 Cloudflare 等 CDN / 反向代理,其 SSL 模式设置也可能产生影响。

回滚 #

  • 建议在实施前备份 Apache 站点配置文件及证书相关文件。
  • 若出现问题,请禁用相关站点并重新加载。
sudo a2dissite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

运维注意事项(续期 / 重新颁发) #

  • 续期 / 重新颁发的基本流程:创建新 CSR → 在 CA 端重新颁发 / 续期 → 替换 fullchain → 重新加载 Apache
  • 怀疑私钥泄露时:吊销 → 使用新密钥创建 CSR → 重新颁发
  • 请勿修改证书文件,务必准确保存已颁发的资料(PEM)
Updated on 2026年6月9日

What are your feelings

  • Happy
  • 常规
  • Sad

©2020 BESTNET.LLC . All Rights Reserved.