Ubuntu系统Apache 2部署SSL证书完整教程

a
admin
作者
2026-07-20
发布日期
约 9 分钟
阅读时间

最近给一个客户部署SSL证书,服务器是Ubuntu系统跑Apache 2,整个过程比想象中简单,把实操步骤记录下来分享给有需要的朋友。

前期准备

开始之前需要准备好这些:

  • 服务器系统:Ubuntu 20.04 或 22.04 LTS
  • Web服务:Apache 2.4 及以上版本
  • 已申请的SSL证书:包括证书文件(.crt或.pem)和私钥文件(.key)
  • 域名已解析到服务器IP
  • sudo权限的账号

如果你还没申请证书,可以去 sslmianfei.com 免费申请一张,支持单域名、通配符和IP证书,不用注册直接用。

第一步:启用Apache SSL模块

Ubuntu默认安装Apache时不会开启SSL模块,需要手动启用:

sudo a2enmod ssl
sudo a2enmod headers
sudo systemctl restart apache2

headers模块后面配置HSTS的时候会用到,建议一起开启。

第二步:上传证书文件

把申请好的证书文件放到服务器上,建议放在专门的目录:

sudo mkdir -p /etc/apache2/ssl/
sudo cp your_domain.crt /etc/apache2/ssl/
sudo cp your_domain.key /etc/apache2/ssl/
# 如果CA颁发机构提供了中间证书,也要上传
sudo cp ca_bundle.crt /etc/apache2/ssl/

权限设置很重要,私钥文件权限要收紧:

sudo chown root:root /etc/apache2/ssl/your_domain.key
sudo chmod 600 /etc/apache2/ssl/your_domain.key
sudo chmod 644 /etc/apache2/ssl/your_domain.crt

第三步:合并证书链

很多朋友部署完后浏览器报”证书不受信任”,90%是证书链没合并。把你的域名证书和CA中间证书合并成一个文件:

cat your_domain.crt ca_bundle.crt > fullchain.crt
sudo mv fullchain.crt /etc/apache2/ssl/

注意顺序:域名证书在前,中间证书在后,不能反过来。

第四步:配置虚拟主机

Apache 2.4默认的SSL配置文件在 /etc/apache2/sites-available/default-ssl.conf,但建议为每个域名单独建配置:

sudo nano /etc/apache2/sites-available/your_domain-ssl.conf

配置内容:

<VirtualHost *:443>
    ServerName your_domain.com
    ServerAlias www.your_domain.com
    DocumentRoot /var/www/your_domain

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/fullchain.crt
    SSLCertificateKeyFile /etc/apache2/ssl/your_domain.key

    # 优化SSL配置
    SSLProtocol all -SSLv2 -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 on
    SSLCompression off

    # HSTS头
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"

    # HTTP/2支持(可选)
    Protocols h2 http/1.1

    # 日志
    ErrorLog ${APACHE_LOG_DIR}/your_domain_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/your_domain_ssl_access.log combined
</VirtualHost>

第五步:启用站点配置

sudo a2ensite your_domain-ssl.conf
sudo apache2ctl configtest
sudo systemctl reload apache2

如果 configtest 输出 Syntax OK 就说明配置没问题。

第六步:HTTP强制跳转HTTPS

光配好HTTPS还不够,要把所有HTTP请求跳转到HTTPS。编辑80端口的虚拟主机配置:

sudo nano /etc/apache2/sites-available/your_domain.conf

添加跳转规则:

<VirtualHost *:80>
    ServerName your_domain.com
    ServerAlias www.your_domain.com
    Redirect permanent / https://your_domain.com/
</VirtualHost>

重载配置生效:

sudo a2ensite your_domain.conf
sudo systemctl reload apache2

验证部署

打开浏览器访问 https://your_domain.com,地址栏应该出现小绿锁。如果想更深入检测,可以用 SSL证书测试工具 检查证书链、安全头部配置是否完整。

常见问题排查

证书不受信任:检查证书链是否合并,fullchain.crt里域名证书在前

私钥不匹配:用下面命令对比证书和私钥的modulus是否一致

openssl x509 -noout -modulus -in your_domain.crt | openssl md5
openssl rsa -noout -modulus -in your_domain.key | openssl md5

两个md5值相同说明匹配。

端口443未开放:检查防火墙

sudo ufw allow 443/tcp
sudo ufw status

Apache启动失败:看错误日志定位

sudo tail -50 /var/log/apache2/error.log

最后

整个过程下来其实就几步:开模块、放证书、配虚拟主机、跳转、验证。最容易踩坑的就是证书链合并和权限设置,这两点搞定了基本就稳了。如果你用的是Nginx而不是Apache,思路是类似的,只是配置语法不同。

希望这篇实操笔记能帮到正在折腾SSL部署的朋友,有问题欢迎留言交流。

本文到此结束