在Apache服务器中配置带有证书链的数字证书

本文介绍如何在Apache服务器中正确配置包含完整证书链的SSL证书,以确保浏览器能够完整验证证书信任链。包括服务器证书与中间证书的正确合并方法、Apache 2.4.8 前后版本的配置差异、常见证书链错误的排查方法。

证书链的技术原理

在 SSL 协议中,证书链是建立信任的核心机制。其工作原理基于公钥基础设施 (PKI) 的分层信任模型:

  • 根 CA 证书:预装在操作系统和浏览器中的信任锚点,数量有限且严格管控。

  • 中间 CA 证书:由根 CA 授权的下级证书颁发机构,负责实际签发终端证书。

  • 服务器证书:为特定域名颁发的终端实体证书。

验证过程:客户端收到服务器证书后,会沿着证书的签发关系向上追溯,直到找到其信任库中的根 CA。这个过程需要验证每一级证书的数字签名,确保整条信任链的完整性。

配置要求:由于客户端仅预装根证书,服务器必须提供完整的证书链(包含服务器证书和所有中间证书),否则客户端无法完成验证,导致连接失败。

适用范围

  • 服务器操作系统:RHEL 及其衍生版或 Debian 及其衍生版。

  • 服务器管理权限:能够以 root 用户身份或通过 sudo 命令执行系统级操作,如安装软件、修改配置文件和重启服务。

  • Apache 版本:Apache 2.4.8 或更高版本。对于 Apache 2.4.7 及更早版本,请直接参考文末的 Apache 2.4.7 及更早版本配置示例

  • 网络访问:确保服务器的防火墙、云平台安全组(Security Group)或其他网络访问控制列表(ACL)已允许外部流量访问 TCP 443 端口。

配置流程

说明

本文涉及的证书文件名以 your_domain.com.pem(服务器证书)、private.key(证书私钥)、chain.pem(中间证书链)、完整证书链文件(fullchain.pem)为例进行说明。

步骤一:准备证书文件

  1. 合并证书链文件。

    将服务器证书文件、证书私钥文件、中间证书文件上传至目标服务器后,使用以下命令按严格顺序将证书文件和中间证书链文件合并,创建为一个完整证书链文件(fullchain.pem)。

    重要

    合并时,必须严格遵守服务器证书在前,中间证书在后的顺序。错误的顺序将导致客户端验证失败。根证书通常已内置于客户端信任库,无需包含在文件中。

    # 格式: cat 服务器证书.pem 证书链.pem > fullchain.pem,请将 your_domain.com.pem、chain.pem、fullchain.pem 替换为实际路径
    cat your_domain.com.pem chain.pem > fullchain.pem
  2. 设置安全的文件权限。

    私钥必须严格保护,防止被未授权的用户或进程读取。将证书和私钥文件移动到服务器的安全目录,并设置严格的权限。

    说明

    本文存储证书相关文件的示例目录为/path/to/your/,请根据实际情况调整命令中的参数值。

    # 私钥文件只允许root用户读写
    sudo chmod 600 /path/to/your/private.key
    
    # 证书文件允许其他用户读取
    sudo chmod 644 /path/to/your/fullchain.pem
    
    # 设置文件所有者为root
    sudo chown root:root /path/to/your/private.key
    sudo chown root:root /path/to/your/fullchain.pem

步骤二:在Apache中配置SSL证书

说明

以下配置仅适用于 Apache 2.4.8 及以上版本。对于 Apache 2.4.7 及更早版本,请直接参考文末的 Apache 2.4.7 及更早版本配置示例

RHEL/CentOS

  1. 安装并启用SSL模块。

    确保mod_ssl模块已安装,为Apache提供SSL功能。

    # 如果未安装mod_ssl,请先执行安装
    sudo yum install mod_ssl -y
  2. 配置SSL虚拟主机。

    请根据实际情况定位到目标配置文件(mod_ssl模块通常会创建一个默认的SSL配置文件,如:/etc/httpd/conf.d/ssl.conf),找到 <VirtualHost *:443> 部分,参考以下内容进行修改或替换。确保 ServerName, SSLCertificateFile, SSLCertificateKeyFile 的值正确。

    <VirtualHost *:443>
        ServerName your_domain.com
    
        # 启用SSL引擎
        SSLEngine on
    
        # 核心证书链配置
        # SSLCertificateFile 指向合并后的完整证书链文件
        SSLCertificateFile /path/to/your/fullchain.pem
        # SSLCertificateKeyFile 指向私钥文件
        SSLCertificateKeyFile /path/to/your/private.key
    </VirtualHost>
  • 重载服务使配置生效。

    # 检查配置文件语法是否有误
    sudo apachectl configtest
    # [预期结果]:输出 "Syntax OK"
    
    # 语法正确后,平滑重载Apache服务
    sudo systemctl reload httpd

Debian/Ubuntu

  1. 启用必要的Apache模块。

    确保 ssl 模块已启用,为Apache提供SSL功能。

    # 启用 SSL 模块
    sudo a2enmod ssl
  2. 配置SSL虚拟主机。

    请根据实际情况定位到目标配置文件(/etc/apache2/sites-available/default-ssl.conf),找到 <VirtualHost *:443> 部分,参考以下内容进行修改或替换。确保 ServerName, SSLCertificateFile, SSLCertificateKeyFile 的值正确。

    <VirtualHost *:443>
        ServerName your_domain.com
    
        # 启用SSL引擎
        SSLEngine on
    
        # 核心证书链配置
        # SSLCertificateFile 指向合并后的完整证书链文件
        SSLCertificateFile /path/to/your/fullchain.pem
        # SSLCertificateKeyFile 指向私钥文件
        SSLCertificateKeyFile /path/to/your/private.key
    </VirtualHost>
  3. 重载服务使配置生效。

    # 启用SSL站点配置
    sudo a2ensite default-ssl
    
    # 检查配置文件语法是否有误
    sudo apache2ctl -t
    # [预期结果]:输出 "Syntax OK"
    
    # 语法正确后,平滑重载Apache服务
    sudo systemctl reload apache2

步骤三:验证配置与测试

配置完成后,必须验证HTTPS服务是否按预期工作。可选择以下任一方式进行验证。

  • 本地命令行测试

    使用openssl命令模拟客户端连接,快速检查SSL握手是否成功以及证书链是否被正确发送。

    openssl s_client -connect your_domain.com:443 -servername your_domain.com -showcerts

    预期结果:在输出的末尾输出 Verify return code: 0 (ok)

  • 浏览器验证

    在主流浏览器(如Chrome, Firefox)中通过 https://your_domain.com 访问网站。

    预期结果:地址栏显示安全锁标志,无任何安全警告。点击锁标志可查看证书详情,确认证书链完整。

Apache 2.4.7 及更早版本配置示例

若当前使用 Apache 2.4.7 或更早版本,请上传服务器证书文件、中间证书文件、证书私钥文件。此时需在配置文件中使用SSLCertificateChainFile 指定中间证书文件。

# 以下配置仅适用于 Apache 2.4.7 及以下版本
<VirtualHost *:443>
    ServerName your_domain.com

    # 启用SSL引擎
    SSLEngine on

    # 核心证书链配置
    SSLCertificateFile /path/to/your/domain.pem
    SSLCertificateKeyFile /path/to/your/private.key
    SSLCertificateChainFile /path/to/your/chain.pem
</VirtualHost>

常见问题

Apache启动失败,日志提示 AH02238 Unable to configure RSA server private key

此错误表示私钥与证书不匹配,请执行以下命令进行确认。

# 分别执行以下两个命令,请将 private.key、fullchain.pem 替换为实际路径

# 从私钥中导出公钥并计算其 SHA256 指纹
openssl pkey -in private.key -pubout -outform DER | openssl dgst -sha256

# 从证书中导出公钥并计算其 SHA256 指纹
openssl x509 -in fullchain.pem -pubkey -noout | openssl pkey -pubin -outform DER | openssl dgst -sha256
说明

openssl x509 命令会默认读取并处理 fullchain.pem 文件中的第一个证书,即服务器证书。也可以在合并文件前,使用服务器证书原始文件(your_domain.com.pem)进行校验。

预期结果:以上两个命令的输出结果必须完全一致。

日志提示 SSLCertificateChainFile is deprecated

此警告表示正在使用一个在Apache 2.4.8版本后被废弃的指令。现代Apache不再需要单独的SSLCertificateChainFile指令。解决方案如下:

  1. 移除配置文件中的 SSLCertificateChainFile 这一行。

  2. 确保 SSLCertificateFile 指令指向一个已按正确顺序合并好的完整证书链文件(即fullchain.pem)。

浏览器提示证书链不完整或 unable to get issuer certificate 错误

此问题通常由证书链文件配置错误导致。检查以下两点:

  1. 合并顺序:确保在合并fullchain.pem文件时,严格遵循“服务器证书在前,中间证书在后”的顺序。

  2. 文件内容:确保证书链文件中包含了所有必要的中间证书,但没有包含根证书。