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

本文将指导您如何在Linux操作系统中的Apache服务器上,配置国密标准SSL数字证书,具体包括证书文件的下载与上传、在Apache上配置证书文件参数,以及安装证书后的结果验证。

重要

本文以Linux操作系统、Apache 2.4.62、Wosign DV国密SSL证书为例。不同版本的操作系统和Web服务器,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务

背景信息

国密SSL证书是指根据中国国家密码局制定的密码算法标准所生成的SSL证书,主要用于满足企业对HTTPS协议国产化改造及国密算法应用的合规要求。如果您的Web应用服务器仅部署了国密SSL证书,则只能在支持国密算法的浏览器中访问,如密信浏览器和红莲花浏览器。因此,为了确保与各类浏览器的兼容性,通常会采取SM2/RSA双证书部署方案。

说明

对于已安装的Apache,需要卸载后重新安装。由于官方版Apache+OpenSSL不支持国密算法,因此如果要适配国密算法,需要重新编译Apache,并指定Wosign厂商的国密SM2模块(wotrus_ssl)。

前提条件

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

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

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

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

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

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

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

操作步骤

步骤一:下载证书

  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. 解压下载的证书压缩包:

    • 签名证书:<证书绑定域名>_sm2_sign.pem<证书绑定域名>_sm2_sign.key

    • 加密证书:<证书绑定域名>_sm2_enc.pem<证书绑定域名>_sm2_enc.key

    • 说明

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

步骤二:安装Apache和沃通国密SM2模块

  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. 执行以下命令,检查Apache服务器是否安装mod_ssl.so模块(启用SSL功能):

    httpd -M | grep 'ssl'

    安装成功效果如下图:

    image..png

    如未安装,可执行sudo yum install -y mod_ssl命令安装。

    RHEL/CentOS 系列

    sudo yum install -y mod_ssl

    Debian/Ubuntu 系列

    sudo apt install -y libapache2-mod-ssl
  4. 安装 Apache 之前,请确保系统具备相关的依赖库,如果系统是全新的,请先安装编译工具:

    RHEL/CentOS 系列

    sudo yum install -y gcc 
    sudo yum install -y gcc-c++

    Debian/Ubuntu 系列

    sudo apt install -y gcc
    sudo apt install -y g++
  5. 下载Apache相关依赖包并编译安装。

    说明

    安装目录仅为示例,您可以根据实际需求将其替换。

    1. 安装apr,它提供了跨平台的基础 API 支持,旨在简化开发人员在不同操作系统上的编程工作。主要功能包括文件操作、内存管理、线程控制等基础服务。

      cd /usr/local
      
      #下载apr
      wget https://dlcdn.apache.org/apr/apr-1.7.5.tar.gz
      
      #解压
      tar -zxvf apr-1.7.5.tar.gz
       
      #配置
      sudo ./configure --prefix=/usr/local/apr
      
      #编译、安装
      sudo make && make install
    2. 安装apr-util,它不仅继承了 APR 的跨平台特性,还在此基础上提供了更为丰富的高级功能。主要涵盖数据库访问接口、加密解密功能、消息队列支持。

      #下载apr-util
      wget http://archive.apache.org/dist/apr/apr-util-1.5.4.tar.gz
      
      #解压
      tar -zxvf apr-util-1.5.4.tar.gz
      
      #配置
      sudo ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
      
      #编译、安装
      sudo make && make install
    3. 安装pcre,Perl兼容正则表达式库,支持Unicode字符集和多种匹配模式。用于URL重写、访问控制等。

      #下载 pcre 安装包
      wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz
      
      #解压pcre安装包
      tar -zxvf pcre-8.45.tar.gz 
      
      #配置
      sudo ./configure --prefix=/usr/local/pcre
      
      #编译、安装
      sudo make && make install
  6. 下载Wosign国密SM2模块并解压。

    #下载
    wget https://www.wotrus.com/download/wotrus_ssl.tar.gz 
    
    #解压
    tar -zxvf wotrus_ssl.tar.gz
  7. 下载Apache服务器安装包并解压编译。

    #下载
    wget https://dlcdn.apache.org/httpd/httpd-2.4.62.tar.gz
    
    #解压
    tar -zxvf httpd-2.4.62.tar.gz
    
    #进入Apache解压完成之后的目录/usr/local/httpd-2.4.62配置
    sudo ./configure --prefix=/usr/local/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork --with-zlib --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-ssl=/usr/local/wotrus_ssl2.0
    
    #编译、安装
    sudo make && make install
重要

--with-ssl=/usr/local/wotrus_ssl2.0需确保与解压后的Wosign国密SM2模块文件路径一致。

  1. 进入Apache安装bin目录(/usr/local/httpd/bin/),启动Apache。

    #进入Apache安装bin目录
    cd /usr/local/httpd/bin/
    #启动Apache 服务
    apachectl start
  2. 在浏览器中输入网站域名,测试Apache是否启动。若正常启动,如下图:

    image

步骤三:在Apache服务器配置SSL证书

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

    #在Apache的配置文件目录下,创建一个cert目录,用于国密标准证书文件、国际标准证书文件(可选)。  
    mkdir /usr/local/httpd/conf/cert
  2. 上传 SSL 证书和私钥文件到服务器的目标目录。

    重要

    本文以 yourdomain.com_sm2_sign.pem(证书文件)和 yourdomain.com_sm2_sign.key(私钥文件)为例,将其上传至服务器的 /usr/local/httpd/conf/cert目录。若该目录不存在,可创建证书存放目录

    阿里云服务器

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

    1. 在前面步骤打开的 Workbench 页面中,选择顶部菜单栏的文件 > 打开新文件树

    2. 在左侧文件树中,右键点击存放证书文件的目标目录(/usr/local/httpd/conf/cert),选择上传文件,选择并上传证书文件 yourdomain.com_sm2_sign.pem

    3. 重复上述操作,再次右键点击目标目录(/usr/local/httpd/conf/cert),选择上传文件,选择并上传私钥文件 yourdomain.com_sm2_sign.key

    4. 上传完成后,证书文件路径为 /usr/local/httpd/conf/cert/yourdomain.com_sm2_sign.pem,私钥文件路径为 /usr/local/httpd/conf/cert/yourdomain.com_sm2_sign.key

    其他云厂商服务器

    请通过对应云厂商提供的文件上传功能,将证书和私钥文件上传到服务器的目标目录(/usr/local/httpd/conf/cert)。

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

    在本地使用 SSH 工具上传证书文件和私钥文件。以下示例中,<username>为当前服务器的用户名,<server_ip>为当前服务器的公网 IP。

    Windows
    1. 使用系统自带的命令提示符(cmd)或 PowerShell,通过 scp 命令上传文件。以证书文件和私钥文件存在本地 C:\ 目录为例。

      # 上传本地证书文件到服务器,请将路径 C:\yourdomain.com_sm2_sign.pem 和 /usr/local/httpd/conf/cert 替换为实际的源文件和目标目录
      scp C:\yourdomain.com_sm2_sign.pem <username>@<server_ip>:/usr/local/httpd/conf/cert
      
      # 上传本地私钥文件到服务器,请将路径 C:\yourdomain.com_sm2_sign.key 和 /usr/local/httpd/conf/cert 替换为实际的源文件和目标目录
      scp C:\yourdomain.com_sm2_sign.key <username>@<server_ip>:/usr/local/httpd/conf/cert
    2. 若系统未集成 scp 命令,可以使用开源免费的 PuTTY 客户端,并配合其附带的 pscp.exe 工具通过命令行上传文件。也可以使用图形化的 WinSCP 上传文件。

    Linux/macOS

    使用系统自带的终端,执行 scp 命令上传文件。以证书文件和私钥文件存在本地 /tmp 目录为例。

    # 上传本地证书文件到服务器,请将路径 yourdomain.com_sm2_sign.pem 和 /usr/local/httpd/conf/cert 替换为实际的源文件和目标目录
    scp /tmp/yourdomain.com_sm2_sign.pem <username>@<server_ip>:/usr/local/httpd/conf/cert
    
    # 上传本地私钥文件到服务器,请将路径 yourdomain.com_sm2_sign.key 和 /usr/local/httpd/conf/cert 替换为实际的源文件和目标目录
    scp /tmp/yourdomain.com_sm2_sign.key <username>@<server_ip>:/usr/local/httpd/conf/cert
  3. 修改Apache配置文件。

    1. /usr/local/httpd/conf目录下,修改httpd.conf配置文件,添加或修改以下配置文件。

    2. #ServerName www.example.com:80 下增加ServerName 域名:80image

    3. #LoadModule ssl_module modules/mod_ssl.so 下去掉前面的注释符 #image

    4. #Include conf/extra/httpd-ssl.conf 下增加 Include conf/ssl.confimage

    5. /usr/local/httpd/conf 目录下,新建ssl.conf 文件,添加如下配置:

      Listen 443
      <VirtualHost *:443>
      ServerName yourdomain.com
      #apache服务访问网站的文件地址
      DocumentRoot /usr/local/httpd/htdocs
      #启用 SSL 功能
      SSLEngine on
      # 配置国密算法签名证书-SM2 证书 sign
      SSLCertificateFile /usr/local/httpd/conf/cert/yourdomain.com_sm2_sign.pem
      SSLCertificateKeyFile /usr/local/httpd/conf/cert/yourdomain.com_sm2_sign.key
      # 配置国密算法加密证书-SM2 证书 enc
      SSLCertificateFile /usr/local/httpd/conf/cert/yourdomain.com_sm2_enc.pem
      SSLCertificateKeyFile /usr/local/httpd/conf/cert/yourdomain.com_sm2_enc.key
      # (可选)配置国际标准RSA算法证书
      SSLCertificateFile /usr/local/httpd/conf/cert/yourdomain.com_public.crt
      SSLCertificateKeyFile /usr/local/httpd/conf/cert/yourdomain.com.key
      SSLCertificateChainFile /usr/local/httpd/conf/cert/yourdomain.com_chain.crt
      #配置支持的SSL/TLS协议版本
      SSLProtocol all -SSLv2 -SSLv3
      #配置加密套件,写法遵循 openssl 标准。
      SSLCipherSuite ECC-SM4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL
      SSLHonorCipherOrder on
      <Directory "/usr/local/httpd/htdocs" >
      Options -Indexes -FollowSymLinks +ExecCGI
      AllowOverride None
      Order allow,deny
      Allow from all
      Require all granted
      </Directory >
      </VirtualHost
      说明

      以上配置仅供参考,请根据实际环境配置具体的证书目录、证书名称及域名等。

  4. 执行如下命令,重启Apache服务。

    sudo /usr/local/httpd/bin/apachectl restart 

步骤四:验证SSL证书是否配置成功

  1. 请通过 HTTPS 访问您已绑定证书的域名(如 https://yourdomain.comyourdomain.com 需替换为实际域名)。

  2. 若浏览器地址栏显示安全锁图标,说明证书已成功部署。如访问异常或未显示安全锁,请先清除浏览器缓存或使用无痕(隐私)模式重试。

    image

    说明

    Chrome 浏览器自 117 版本起,地址栏中的image已被新的image替代,需单击该图标后查看安全锁信息。

    image

重要

国密标准SSL数字证书需与支持国密算法的浏览器(如360、密信、红莲花浏览器)配合使用,以确保通信安全。这类浏览器能识别并启用国密算法,与部署国密标准SSL证书的服务器实现安全通信。

说明

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

后续步骤(可选)

开启域名监控

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

常见问题

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

常见原因如下:

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

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