证书业务介绍
更新时间: 2025/12/23
在Gitcode上查看源码

背景介绍

数字证书(或简称证书)是在 Internet 上唯一地标识人员和资源的电子文件。证书使两个实体之间能够进行安全、保密的通信。

数据加密

数据加密分为两种方式:

  • 对称加密:只有一个密钥,加密解密均使用该密钥。速度快、安全性低
  • 非对称加密:区分公钥和私钥。速度慢、安全性高,数字证书在非对称加密体系上演进而来。

非对称加密

非对称加密由密钥对构成,发布者生成私钥(private key)和公钥 (public key),然后将公钥公开给其他人,私钥自己持有不公开;私钥始终是保密的。

公私钥对有如下特性:

  1. 公钥加密的数据,只有私钥才可以解密 -- 数据加密
  2. 私钥加密的数据,只有公钥才可以解密 -- 数字签名

数据加密流程:

数字签名流程:

证书

证书是基于公钥加密的,公钥加密使用数字密钥对(很长的数字)对信息进行加密或编码,从而使信息只能被目标收件人读取。然后,收件人对信息进行解密(解码)即可读取该信息。

为了保证网络上流通的公钥可信,还需要一个CA机构来对公钥进行签名盖章,保证此公钥被CA机构认可,为有效证书。

证书除了包括公钥,也会存一些身份信息:

证书的各字段解释如下:

  • 版本:即使用X.509的版本,目前普遍使用的是v3版本(0x2)。
  • 序列号:颁发者分配给证书的一个正整数,同一颁发者颁发的证书序列号各不相同,可与颁发者名称一起作为证书的唯一标识。
  • 签名算法:颁发者颁发证书时使用的签名算法。
  • 颁发者:颁发该证书的设备名称,必须与颁发者证书中的主体名一致。通常为CA服务器的名称。
  • 有效期:包含有效的起、止日期,不在有效期范围内的证书为无效证书。
  • 主体名:证书拥有者的名称,如果与颁发者相同则该证书是一个自签名证书。
  • 公钥信息:用户对外公开的公钥以及公钥算法信息。
  • 扩展信息:通常包含证书的用法、CRL的发布地址、OCSP服务器的URL等可选字段。
  • 签名:颁发者用私钥对证书信息的签名。

用途

在互联网中,证书使用最广泛的是https协议。基于https访问网站时,需要基于TLS进行加密通信。

BMC中的证书

V3中,所有的BMC使用的证书都由Trust模块来管理。Trust负责汇总BMC中所有的证书,给其他组件提供基础的证书数据,支持业务使用证书来校验对端、认证BMC、认证用户等。

主要功能

管理BMC所有信任CA根证书,以支持SMTP/ syslog/ web/ redfish/ ldap的证书签发机构可信校验

支持CA证书的吊销列表维护与检查(包含OCSP,只有证书认证支持)

支持SSL证书自动更新(CMPv2)

管理TLS服务器证书,支持证书导入(csr签名、客户自定义),敏感信息持久化保存。

管理双因素认证中的用户证书

V2的证书业务功能如下:

业务具体类型类型类型解释功能个数是否支持证书链吊销列表
WebSSL证书带私钥BMC身份证书远端认证BMC单个不涉及
告警Syslog服务器证书不带私钥远程服务器证书BMC认证远程服务器单个
告警Syslog本地证书带私钥BMC身份证书远端认证BMC单个不涉及
告警SMTP服务器证书不带私钥远程服务器证书BMC认证远程服务器单个
LDAPLDAP服务器证书不带私钥远程服务器证书BMC认证远程服务器单个(V2是6个服务器,每个服务器指定一个)
双因素认证服务器根证书不带私钥远程服务器证书BMC认证二级证书多个(V2是16个)
双因素认证服务器根证书签发的二级证书不带私钥用户身份证书BMC(ngnix)认证用户单个(V2是每个用户一个)不涉及
Redfish远程HTTPS传输服务器证书(Redfish事件订阅)不带私钥远程服务器证书BMC认证远程服务器多个(V2是4个)
Redfish远程HTTPS传输服务器证书(远程文件传输)不带私钥远程服务器证书BMC认证远程服务器多个(V2是4个)
WebCA服务器证书(CA自动更新SSL证书)不带私钥远程服务器证书BMC认证远程服务器单个
WebCA服务器对应的本地证书(CA自动更新SSL证书)带私钥BMC身份证书远端认证BMC单个不涉及

CA证书

负责在BMC中校验对端服务器是否可信,主要涉及到如下功能:

  • 远程认证 LDAP中校验对端服务器
  • 告警上报 SMTP邮件服务器中校验对端服务器
  • 告警上报 Syslog报文发送到远程服务器时,校验对端服务器
  • Redfish事件上报时,校验对端服务器
  • 远程文件传输,校验对端服务器
  • 证书认证中,用来校验用户身份证书是否可信
  • SSL证书更新中,和对端通信时用来校验对端CA服务器是否可信

底层存储与资源树展示

CA证书在系统的/data/trust/cert/ca目录进行存储,文件名为证书hash值.0(方便开源软件使用目录进行认证),持久化数据库中,存储文件路径与hash值。

资源树展示:在trust模块启动时,会读取目前已有的文件路径,将证书信息读取后展示到资源树上,资源树路径:/bmc/kepler/Managers/:ManagerId/Certificates/:CertificateId

资源树属性:

Fingerprint	
FingerprintHashAlgorithm	默认SHA256
Issuer	颁发者,签发者
KeyUsage	
SerialNumber	
SignatureAlgorithm	
Subject	使用者
ValidNotAfter	失效日期
ValidNotBefore	生效日期
FilePath	文件路径
CommonName	证书名,使用者CN字段
CertChainLength	证书链中证书个数,如果是单个证书大小为1
KeyLength	秘钥长度

吊销列表

每个CA证书支持对应一个吊销列表,可以同步校验该CA证书签发的证书,哪些证书已经被吊销。

吊销列表只能依附于CA证书存在,在/data/trust/cert/ca目录进行存储,文件名为证书hash值.r0(方便开源软件使用目录进行认证),持久化数据库中,存储了文件路径与hash值。

资源树属性:

CRLStartTime	吊销列表有效期开始时间
CRLExpireTime	吊销列表有效期结束时间

SSL证书

SSL证书是私钥存储在BMC侧,能表明BMC身份,提供给外部服务来认证BMC的证书。主要供TLS协议使用。

底层存储与资源树展示

SSL证书在系统的/data/trust/cert/ssl目录进行存储,文件名为SSL_1.crt,持久化数据库中,存储文件公钥路径、加密私钥与hash值。

资源树展示:在trust模块启动时,会读取目前SSL证书路径,解析证书信息,将相关数据展示到资源树上,资源树路径:/bmc/kepler/Managers/:ManagerId/NetworkProtocol/HTTPS/Certificates/:CertificateId

在装备流程,执行一机一证逻辑时,会生成一份预置证书,一般在客户使用场景,不会有不存在SSL证书的情况,更多的时SSL证书替换场景。

SSL证书的资源树属性和CA证书一致,不存在吊销列表,对BMC来说,有且仅有一份SSL证书

证书签名请求(CSR)生成与服务器证书

BMC支持内部生成私钥与证书签名请求CSR,外部使用CSR签名,再导入SSL证书。此方式下私钥独立生成,不会泄露,安全性高

涉及到两个主要流程:

  1. CSR生成与证书导入

客户提供证书CSR相关配置(包括Country、State、Location、Organization、OrganizationUnit、CommonName),BMC利用配置,先生成私钥,同时利用私钥对配置进行签名,生成相关的CSR文件

入口函数

CSR生成 trust_app.lua文件中StartGenerateCSR方法
  1. 服务器证书导入

此服务器证书由外部CA服务器用CSR文件签名而来,该证书不包含私钥,仅有公钥信息

入口函数

证书导入 certificate_collection_ssl.lua文件中import_cert方法

自定义证书

如果想使用自己已经生成好,带私钥的证书,可以直接导入带私钥的证书到BMC中,此方式流程简单。

入口函数

证书导入 certificate_collection_ssl.lua文件中import_cert_with_key方法

Redfish接口调整

V2证书各个业务分散管理,V3统一管理,保证证书业务的完整性。

V3接口侧变更较大,所有不支持多根的接口均改为多根

常见问题

  • web打不开,ssh可以访问

需要排查是否为ssl证书缺失:

  1. cli命令查询ssl证书:

    ipmcget -t certificate -d info
  2. 如果是debug版本,可以直接查询资源树:

    busctl --user introspect bmc.kepler.trust /bmc/kepler/Managers/1/NetworkProtocol/HTTPS/Certificates/1

    或者查询底层证书数据库:

    /usr/sbin/sqlite3 /data/trust/persistence/per_poweroff.db "SELECT * FROM persist_table;" | grep t_certificate

    ssl证书的id为CertificateUsageType:1,Id:1

  • 如何导入SSL证书

一般开发侧多用自定义证书。cli命令导入:

ipmcset -t certificate -d import -v <localpath/URL> <type> [passphrase]

如果是本地文件,需要先放在/tmp目录下

busctl命令导入:

busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 URI /tmp/cert.p12 123456

注意:导入证书前,需要保证时间在证书有效期内,否则会导入失败

  • 导入CA证书
  1. web界面进行操作

  2. redfish接口,见Redfish接口调整章节

  3. busctl命令

    busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCert a{ss}issu 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 0 URI /tmp/ca.crt 0
  • 如何校验ssl证书私钥与公钥是否匹配

(该操作仅root权限才可以执行)首先使用fifo管道导出私钥文件,然后使用openssl命令进行校验即可

bash
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ExportCertKeyByFIFO a{ss}i 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 1
sleep 1
cat /dev/shm/tmp_cert_fifo.key > /tmp/cert_fifo.key
openssl rsa -noout -modulus -in /tmp/cert_fifo.key |openssl md5
openssl x509 -noout -modulus -in /data/trust/cert/ssl/SSL_1.crt |openssl md5

下游使用相关

  1. 如果使用证书文件,ca证书可以在/data/trust/cert/ca下获取,ssl证书可以在/data/trust/cert/ssl下获取

  2. 如果需要使用证书资源树,ca证书可以在**/bmc/kepler/Managers/1/Certificates/下获取,ssl证书可以在/bmc/kepler/Managers/1/NetworkProtocol/HTTPS/Certificates/1**下获取

  3. 如果需要获取证书链信息,可以使用如下接口:

    busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService GetCertChainInfo a{ss}iu 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 1 1
  4. 如果需要获取SSL证书私钥信息,可以使用如下接口:

    busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ExportCertKeyByFIFO a{ss}i 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 1

附录

证书相关Busctl命令:

bash
查看证书服务资源信息
busctl --user introspect bmc.kepler.trust /bmc/kepler/CertificateService

导入CA证书
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCert a{ss}issu 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 0 URI /tmp/ca.crt 0

busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCert a{ss}issu 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 0 text /home/xxx/project/v3_proto/all_git/interface/redfish/test/integration/.test_temp_data/RootCA.crt 0

查看ca证书
busctl --user introspect bmc.kepler.trust /bmc/kepler/Managers/1/Certificates/1
busctl --user get-property bmc.kepler.trust /bmc/kepler/Managers/1/Certificates/1 bmc.kepler.CertificateService.Certificate  Subject

查看ssl证书
busctl --user introspect bmc.kepler.trust /bmc/kepler/Managers/1/NetworkProtocol/HTTPS/Certificates/1
busctl --user get-property bmc.kepler.trust /bmc/kepler/Managers/1/NetworkProtocol/HTTPS/Certificates/1 bmc.kepler.CertificateService.Certificate  Subject

导入带私钥的SSL证书
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 URI /tmp/cert.p12 123456
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 URI "https://[ip]:[端口号]/openssl3/v5/server_chain.p12" 123456

busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCertWithKey a{ss}sss 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 text /tmp/cert.p12 123456

有时需要重设bmc时间,否则证书因时间不正确无法导入:
date -s "2023-07-13 00:00:00"

开始生成CSR
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService StartGenerateCSR a{ss}ssssss 0 CN '' '' '' '' HW

检查生成CSR的状态,查看CSR任务即可
busctl --user introspect bmc.kepler.trust /bmc/kepler/CertificateService/TaskService/Tasks/

导出CSR到本地
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ExportCSR a{ss}s 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 /tmp/test.csr

导出CSR到远程
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ExportCSR a{ss}s 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 "https://[ip]:[端口号]/tmp/test123.csr"

导入csr签名的证书
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCert a{ss}issu 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 1 URI /tmp/ssl.cert 0

获取证书链信息
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService GetCertChainInfo a{ss}iu 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 1 1

导出证书私钥到fifo管道
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ExportCertKeyByFIFO a{ss}i 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 1

导入吊销列表
busctl --user call bmc.kepler.trust /bmc/kepler/CertificateService bmc.kepler.CertificateService ImportCRL a{ss}ssu 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1 URI /tmp/test.crl 0

删除吊销列表
busctl --user call bmc.kepler.trust /bmc/kepler/Managers/1/Certificates/1 bmc.kepler.CertificateService.Certificate DeleteCRL a{ss} 3 Interface Busctl UserName Administrator ClientAddr 127.0.0.1