技术教程
PEM 格式 SSL 证书部署指南
本文是将证书颁发机构(CA)管理控制台颁发的 PEM 格式 SSL 证书,
部署到 Ubuntu 24 + Apache + WordPress 环境中的通用教程。
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)。
整体部署流程 #
- 将证书文件保存到指定位置
- 准备中间证书(证书链)
- 创建完整证书链 fullchain(服务器证书 + 中间证书)
- 验证私钥与证书是否匹配
- 配置 Apache HTTPS 虚拟主机(包括 80 → 443 重定向)
- 重新加载 Apache,并处理 WordPress 的 URL / 混合内容问题
- 验证运行情况(证书链、重定向、证书信息)
步骤 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 等信息
常见故障排查 #
回滚 #
- 建议在实施前备份 Apache 站点配置文件及证书相关文件。
- 若出现问题,请禁用相关站点并重新加载。
sudo a2dissite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2运维注意事项(续期 / 重新颁发) #
- 续期 / 重新颁发的基本流程:创建新 CSR → 在 CA 端重新颁发 / 续期 → 替换 fullchain → 重新加载 Apache
- 怀疑私钥泄露时:吊销 → 使用新密钥创建 CSR → 重新颁发
- 请勿修改证书文件,务必准确保存已颁发的资料(PEM)