在Apache服务器安装SSL证书(Linux)

本文介绍在Apache服务器上配置单域名或多域名证书、以及通配符域名证书的方法,包括证书文件的下载与上传、配置证书参数及安装后的验证步骤。

重要

本文以Linux操作系统、Apache/Apache2服务器为例介绍。不同版本的操作系统或Web服务器,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务

前提条件

  • 已通过数字证书管理服务购买和申请证书(状态已签发)。如需购买和申请证书,请参见购买正式证书申请证书

  • 域名已正确解析至当前服务器,且已完成工信部 ICP 备案(适用于中国内地服务器)。

    如何查看域名解析记录以及 ICP 备案信息

    打开网络拨测工具,选择网络诊断分析,输入当前域名,确认以下信息:

    • DNS 服务商解析结果中 A 记录的 IP 为当前服务器的公网 IP。

    • 备案检查网站已备案。若显示“网站未备案,请咨询网站服务器提供商”,请完成备案后再安装证书。

  • 已获得本服务器的管理权限(即“root账号”或“有 sudo 权限”的账号)。

  • 已在Apache服务器安装mod_ssl.so模块(启用SSL功能)。

    如未安装,可执行sudo yum install -y mod_ssl命令安装。安装后,可执行httpd -M | grep 'ssl'检查mod_ssl.so是否安装成功。安装成功效果如下图:

    image..png

操作步骤

步骤一:下载SSL证书

  1. 登录数字证书管理服务控制台。在左侧导航栏选择证书管理 > SSL证书管理

  2. SSL证书管理页面,定位需部署的目标证书,并确认以下信息:

    1. 证书状态:确保其为已签发。若为即将过期已过期,则需续费SSL证书

    2. 绑定域名:确保其能够匹配所有需保护的域名,否则未匹配的域名访问 HTTPS 时将出现安全警告。如需添加或修改,请参见追加和更换域名

      确认证书是否匹配目标域名

      证书的绑定域名可包含多个精确域名和通配符域名。每类域名的匹配规则如下:

      • 精确域名:仅对指定域名生效。

        • example.com 仅对 example.com 生效。

        • www.example.com 仅对 www.example.com 生效。

      • 通配符域名:仅对其一级子域名生效。

        • *.example.com 对 www.example.coma.example.com 等一级子域名生效。

        • *.example.com 对根域名 example.com 和多级子域名 a.b.example.com 不生效。

      说明

      如需匹配多级子域名,绑定域名中需包含该域名(如 a.b.example.com),或包含相应的通配符域名(如 *.b.example.com)。

  3. 在目标证书操作列单击更多进入证书详情页面,然后在下载页签中下载服务器类型Apache 的证书。

  4. 解压下载的证书压缩包:

    • 若同时包含证书文件(<绑定域名>_public.crt)、证书链文件(<绑定域名>_chain.crt)和私钥文件(<绑定域名>.key),请妥善保存上述文件,后续部署时均需使用。

    • 若仅包含证书文件(<绑定域名>_public.crt)、证书链文件(<绑定域名>_chain.crt),不含私钥文件(<绑定域名>.key),需配合您本地保存的私钥文件一起部署。

      说明

      若申请证书时使用 OpenSSL、Keytool 等工具生成 CSR 文件,私钥文件仅保存在您本地,下载的证书包中不包含私钥。如私钥遗失,证书将无法使用,需重新购买正式证书并生成CSR和私钥。

步骤二:在Apache服务器安装证书

  1. 登录 Linux 服务器。

    阿里云服务器

    以下操作以阿里云云服务器 ECS 为例进行说明,其他类型的服务器请参照对应产品文档进行操作。

    1. 登录ECS管理控制台,在页面左侧顶部,选择目标ECS实例所在地域。

    2. 在左侧导航栏中选择实例与镜像 > 实例,在实例页面找到目标ECS实例,点击操作列的远程连接

    3. 在弹出的对话框中,选择通过Workbench远程连接并单击立即登录

    4. 选择终端连接作为连接方式,输入相关认证信息,并根据页面提示完成登录,即可进入服务器终端。详细操作请参考使用Workbench登录ECS实例

      说明

      若系统弹出“安全组白名单开通提示”面板,请按照页面提示单击一键添加

    其他云厂商服务器

    请通过对应云厂商提供的远程连接功能登录服务器终端。

    非云厂商服务器(如物理服务器、IDC托管主机等)

    请在本地使用SSH工具登录服务器终端。

    • Windows:在命令提示符(cmd)或PowerShell中运行:ssh用户名@服务器IP。如不支持 ssh 命令,可使用第三方软件(如 PuTTYWinSCP等)进行连接。

    • macOS/Linux:在系统自带的终端(Terminal)中运行:ssh用户名@服务器IP

    后续部分命令因操作系统类型不同而略有差异。请根据实际的服务器操作系统,选择对应的命令操作。

    • RHEL/CentOS 系列:包括 Alibaba Cloud Linux、Red Hat Enterprise Linux、CentOS、AlmaLinux、Rocky Linux、Anolis OS 及其衍生版本。

    • Debian/Ubuntu 系列:包括 Debian、Ubuntu 及其衍生版本。

    如何确认操作系统所属系列

    在服务器终端执行 cat /etc/os-release,根据输出的 ID_LIKEID 判断:

    • 若 ID_LIKE 或 ID 包含 rhel 或 centos,操作系统属于 RHEL/CentOS 系列。

    • 若 ID_LIKE 或 ID 包含 debian 或 ubuntu,操作系统属于 Debian/Ubuntu 系列。

  2. 开放安全组和防火墙的 443 端口。

    1. 在服务器终端执行以下命令,检测443端口的开放情况:

      RHEL/CentOS 系列

      command -v nc > /dev/null 2>&1 || sudo yum install -y nc
      # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP
      sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443

      如果输出 Ncat: Connected to <当前服务器公网 IP>:443,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。

      Debian/Ubuntu 系列

      command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat
      # 请将以下的 <当前服务器的公网 IP> 替换为当前服务器的公网 IP
      sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443

      若输出 Connection to <当前服务器公网 IP> port [tcp/https] succeeded![<当前服务器公网 IP>] 443 (https) open,则表明443端口已开放。否则需在安全组和防火墙中开放443端口。

    2. 若端口未开放,可参照如下操作在安全组和防火墙中开放443端口。

      1. 在安全组中开放 443 端口

      重要

      若您的服务器部署在云平台,请确保其安全组已开放 443 端口 (TCP),否则外部无法访问服务。以下操作以阿里云 ECS 为例,其他云平台请参考其官方文档。

      1. 登录ECS管理控制台,在页面左侧顶部,选择目标 ECS 实例所在地域。在实例页面,找到目标 ECS 实例。

      2. 单击目标实例名称,进入实例详情页面,单击安全组 > 内网入方向全部规则,确保存在一条授权策略允许协议类型为 TCP、目的端口范围为 HTTPS(443)、授权对象任何位置(0.0.0.0/0)的规则。

      3. 如不存在上述规则,请按以下步骤添加。更多安全组配置请参见添加安全组规则

        1. 在 ECS 实例详情页面,单击安全组 > 安全组列表,选择目标安全组并进入其详情页。

        2. 在安全组详情页的安全组详情 > 入方向下,单击增加规则

        3. 新建安全组规则面板,将访问目的(本实例)设置为 HTTPS(443),其余参数保持默认值,单击确定即可。

      2. 在服务器本地防火墙中开放 443 端口

      执行以下命令,识别系统当前的防火墙服务类型:

      if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
          echo "firewalld"
      elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then
          echo "ufw"
      elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then
          echo "nftables"
      elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then
          echo "iptables"
      elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then
          echo "iptables"
      else
          echo "none"
      fi

      若输出为 none,则无需进一步操作。否则,请根据输出的类型(firewalldufwnftablesiptables),执行以下命令开放 443 端口:

      firewalld

      sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload

      ufw

      sudo ufw allow 443/tcp

      nftables

      sudo nft add table inet filter 2>/dev/null
      sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null
      sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/null

      iptables

      sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

      为避免 iptables 规则在系统重启后失效,请执行以下命令持久化 iptables 规则:

      RHEL/CentOS 系列
      sudo yum install -y iptables-services
      sudo service iptables save
      Debian/Ubuntu 系列
      sudo apt-get install -y iptables-persistent
      sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
  3. ApacheApache2部署SSL证书的步骤基本一致,请参照选择合适的版本。

    Apache

    1. 将证书文件和私钥文件上传至您创建的用于存放证书文件的目录下。

      说明

      您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTY、XshellWinSCP等。如果您使用的是阿里云云服务器 ECS,上传文件具体操作,请参见使用远程桌面或Windows APPWindows实例传输文件上传文件到Linux云服务器

    2. 为确保Apache服务器能够正常启用SSL模块,请按以下步骤修改对应的配置文件:

      • 找到/etc/httpd/conf.modules.d/00-ssl.conf文件,修改LoadModule ssl_module modules/mod_ssl.so配置项,若前面有#号,需移除以取消注释,修改后保存文件。

        image

      • 找到/etc/httpd/conf/httpd.conf文件,修改Include conf.modules.d/*.conf配置项,若前面有#号,需移除以取消注释,修改后保存文件。

        image

      需要注意的是,上述配置项所在文件的具体位置可能会因系统版本或安装方式而有所不同。为了找到这些配置的确切位置,您可以使用grep 命令来在Linux系统上查找包含特定文本的所有文件。

      #查找包含LoadModule ssl_module的所有文件。
      sudo grep -r "LoadModule ssl_module" /etc/httpd/

      image

      #查找包含Include conf.modules.d的所有文件。
      sudo grep -r "Include conf.modules.d" /etc/httpd/

      image

      重要

      如果仍未找到以上参数,请确认您的Apache服务器中是否已经安装mod_ssl.so模块。如未安装,可执行sudo yum install -y mod_ssl命令安装,安装后,可执行httpd -M | grep 'ssl'命令检查mod_ssl.so模块是否安装成功。

      202211日起CentOS官方将不再对CentOS 8提供服务支持,如果您的操作系统是CentOS 8,yum命令可能无法正常使用,具体解决办法,请参见CentOS 8 EOL如何切换源?

    3. 修改与证书相关的配置。

      1. 执行以下命令,打开ssl.conf。

        sudo vim /etc/httpd/conf.d/ssl.conf
        重要

        ssl.conf文件在不同操作系统的位置和名称不一样,在没有ssl.conf文件的情况下,请您查看Apache服务器安装目录是否存在conf/extra/http-ssl.conf配置文件。

      2. ssl.conf配置文件中,定位到以下参数,按照中文注释修改。

        安装单域名或多域名证书配置文件

        <VirtualHost *:443> 
         ServerName example.com # 修改为申请证书时绑定的域名。 
         SSLCertificateFile cert/domain_name_public.crt # 将domain_name_public.crt替换成您证书文件名。
         SSLCertificateKeyFile cert/domain_name.key # 将domain_name.key替换成您证书的密钥文件名。
         SSLCertificateChainFile cert/domain_name_chain.crt # 将domain_name_chain.crt替换成您证书的证书链文件名。
         
         #自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
         #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
         #SSLProtocol all -SSLv2 -SSLv3 # 添加SSL协议支持协议,去掉不安全的协议。
         #SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM # 修改加密套件。
        </VirtualHost>
        
        #如果证书包含多个域名,复制VirtualHost参数,并将ServerName修改为第二个域名。 
        <VirtualHost *:443> 
         ServerName example2.com#修改为申请证书时绑定的第二个域名。 
         SSLCertificateFile cert/domain_name2_public.crt # 将domain_name2替换成您申请证书时的第二个域名。
         SSLCertificateKeyFile cert/domain_name2.key # 将domain_name2替换成您申请证书时的第二个域名。
         SSLCertificateChainFile cert/domain_name2_chain.crt # 将domain_name2替换成您申请证书时的第二个域名。
         
         SSLEngine on 
         SSLHonorCipherOrder on
         #自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
         #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
         #SSLProtocol all -SSLv2 -SSLv3 # 添加SSL协议支持协议,去掉不安全的协议。
         #SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM # 修改加密套件。
        </VirtualHost>

        安装通配符域名证书配置文件

        <VirtualHost _default_:443>
        
        #自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要修改)
        #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差
        SSLProtocol all -SSLv2 -SSLv3
        SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
        
        #将domain_name_public.crt替换成您证书文件名。
        SSLCertificateFile /etc/httpd/cert/domain_name_public.crt 
        
        #将domain_name.key替换成您证书的私钥文件名。
        SSLCertificateKeyFile /etc/httpd/cert/domain_name.key
        
        #将domain_name_chain.crt替换成您证书的证书链文件名。
        SSLCertificateChainFile /etc/httpd/cert/domain_name_chain.crt
        
        </VirtualHost>
        重要

        如果您要在Apache服务器安装多域名SSL证书,请关注您的浏览器版本是否支持SNI功能。如果不支持,多域名证书配置将无法生效。

    4. 可选:请根据您的业务需要,在/etc/httpd/conf/httpd.conf文件中添加以下重定向代码,设置HTTP请求自动跳转到HTTPS。

      RewriteEngine on
      RewriteCond %{SERVER_PORT} !^443$
      RewriteRule ^(.*)$ https://%{SERVER_NAME}$1 [L,R]
    5. 执行以下命令,重启Apache服务器,使修改后配置文件生效,确保SSL模块被正常启用。

      sudo systemctl restart httpd 

    Apache2

    1. 执行以下命令,在Apache2的安装目录下创建一个用于存放证书的ssl目录。

      mkdir /etc/apache2/ssl
    2. 将证书文件和私钥文件上传到Apache2证书目录(/etc/apache2/ssl)。

      说明

      您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTY、XshellWinSCP等。如果您使用的是阿里云云服务器 ECS,上传文件具体操作,请参见使用远程桌面或Windows APPWindows实例传输文件上传文件到Linux云服务器

    3. 执行以下命令,启用SSL模块。

      sudo a2enmod ssl

      image.png

      1. SSL模块启用后,会在/etc/apache2/sites-available目录生成SSL证书配置文件default-ssl.conf。

        说明

        default-ssl.conf文件可能存放在/etc/apache2/sites-available/etc/apache2/sites-enabled目录中。

        1. sites-available目录存放的是可用的虚拟主机。

        2. sites-enabled目录存放的是已经启用的虚拟主机。

      2. SSL模块启用后,会自动放行用于HTTPS服务的443端口。若443端口未自动放行,可在/etc/apache2/ports.conf配置文件中添加Listen 443,手动放行443端口。

    4. 编辑default-ssl.conf文件,修改与证书相关的配置。

      1. 执行以下命令,打开default-ssl.conf文件。

        vim /etc/apache2/sites-available/default-ssl.conf
      2. default-ssl.conf配置文件中,定位到以下参数,按照中文注释修改。

        ServerName example.com  #请将example.com替换为您证书绑定的域名。部分服务器,没有该配置参数,您需要手动添加。
        SSLCertificateFile /etc/apache2/ssl/domain_name_public.crt  #证书文件路径。请替换为实际证书文件路径。
        SSLCertificateKeyFile /etc/apache2/ssl/domain_name.key   #证书私钥文件路径。请替换为实际证书私钥文件路径。
        SSLCertificateChainFile /etc/apache2/ssl/domain_name_chain.crt  #证书链文件路径。请替换为实际证书链文件路径。
    5. 执行以下命令,将default-ssl.conf映射至/etc/apache2/sites-enabled目录,实现两者之间的自动关联。

      sudo ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/001-ssl.conf
    6. 执行以下命令,重新加载Apache2配置文件。

      sudo /etc/init.d/apache2 force-reload

      image.png

    7. 执行以下命令,重启Apache2服务。

      sudo /etc/init.d/apache2 restart

      image.png

步骤三:验证SSL证书是否安装成功

证书安装完成后,您可通过访问证书绑定的域名验证该证书是否安装成功。

https://yourdomain   #需要将yourdomain替换成证书绑定的域名。

如果浏览器的地址栏出现image图标,表示证书已经安装成功。Chrome浏览器自117版本开始已将地址栏中的image图标移至image图标中,如下图所示:

image

说明

如仍有问题,请参考常见问题进行排查。

后续步骤(可选)

开启域名监控

建议在证书部署完成后,为域名开启域名监控功能。系统将自动检测证书有效期,并在到期前发送提醒,帮助您及时续期,避免服务中断。具体操作请参见购买并开启公网域名监控

常见问题

安装或更新证书后,证书未生效或 HTTPS 无法访问

常见原因如下:

如何更新(替换)Apache 中已安装的 SSL 证书

请先备份服务器上原有的证书文件(.crt,以及.key文件),然后登录数字证书管理服务控制台,下载新的证书文件,并上传到目标服务器覆盖原有文件(确保路径和文件名一致)。最后,重启Apache服务,使新证书生效。