背景介绍
数字证书(或简称证书)是在 Internet 上唯一地标识人员和资源的电子文件。证书使两个实体之间能够进行安全、保密的通信。
数据加密
数据加密分为两种方式:
- 对称加密:只有一个密钥,加密解密均使用该密钥。速度快、安全性低
- 非对称加密:区分公钥和私钥。速度慢、安全性高,数字证书在非对称加密体系上演进而来。
非对称加密
非对称加密由密钥对构成,发布者生成私钥(private key)和公钥 (public key),然后将公钥公开给其他人,私钥自己持有不公开;私钥始终是保密的。
公私钥对有如下特性:
- 公钥加密的数据,只有私钥才可以解密 -- 数据加密
- 私钥加密的数据,只有公钥才可以解密 -- 数字签名
数据加密流程:
数字签名流程:
证书
证书是基于公钥加密的,公钥加密使用数字密钥对(很长的数字)对信息进行加密或编码,从而使信息只能被目标收件人读取。然后,收件人对信息进行解密(解码)即可读取该信息。
为了保证网络上流通的公钥可信,还需要一个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的证书业务功能如下:
| 业务 | 具体类型 | 类型 | 类型解释 | 功能 | 个数 | 是否支持证书链 | 吊销列表 |
|---|---|---|---|---|---|---|---|
| Web | SSL证书 | 带私钥 | BMC身份证书 | 远端认证BMC | 单个 | 是 | 不涉及 |
| 告警 | Syslog服务器证书 | 不带私钥 | 远程服务器证书 | BMC认证远程服务器 | 单个 | 否 | 有 |
| 告警 | Syslog本地证书 | 带私钥 | BMC身份证书 | 远端认证BMC | 单个 | 否 | 不涉及 |
| 告警 | SMTP服务器证书 | 不带私钥 | 远程服务器证书 | BMC认证远程服务器 | 单个 | 否 | 无 |
| LDAP | LDAP服务器证书 | 不带私钥 | 远程服务器证书 | BMC认证远程服务器 | 单个(V2是6个服务器,每个服务器指定一个) | 是 | 有 |
| 双因素认证 | 服务器根证书 | 不带私钥 | 远程服务器证书 | BMC认证二级证书 | 多个(V2是16个) | 是 | 有 |
| 双因素认证 | 服务器根证书签发的二级证书 | 不带私钥 | 用户身份证书 | BMC(ngnix)认证用户 | 单个(V2是每个用户一个) | 否 | 不涉及 |
| Redfish | 远程HTTPS传输服务器证书(Redfish事件订阅) | 不带私钥 | 远程服务器证书 | BMC认证远程服务器 | 多个(V2是4个) | 是 | 有 |
| Redfish | 远程HTTPS传输服务器证书(远程文件传输) | 不带私钥 | 远程服务器证书 | BMC认证远程服务器 | 多个(V2是4个) | 是 | 有 |
| Web | CA服务器证书(CA自动更新SSL证书) | 不带私钥 | 远程服务器证书 | BMC认证远程服务器 | 单个 | 否 | 有 |
| Web | CA服务器对应的本地证书(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证书。此方式下私钥独立生成,不会泄露,安全性高
涉及到两个主要流程:
- CSR生成与证书导入
客户提供证书CSR相关配置(包括Country、State、Location、Organization、OrganizationUnit、CommonName),BMC利用配置,先生成私钥,同时利用私钥对配置进行签名,生成相关的CSR文件
入口函数
CSR生成 trust_app.lua文件中StartGenerateCSR方法- 服务器证书导入
此服务器证书由外部CA服务器用CSR文件签名而来,该证书不包含私钥,仅有公钥信息
入口函数
证书导入 certificate_collection_ssl.lua文件中import_cert方法自定义证书
如果想使用自己已经生成好,带私钥的证书,可以直接导入带私钥的证书到BMC中,此方式流程简单。
入口函数
证书导入 certificate_collection_ssl.lua文件中import_cert_with_key方法Redfish接口调整
V2证书各个业务分散管理,V3统一管理,保证证书业务的完整性。
V3接口侧变更较大,所有不支持多根的接口均改为多根
常见问题
- web打不开,ssh可以访问
需要排查是否为ssl证书缺失:
cli命令查询ssl证书:
ipmcget -t certificate -d info如果是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_certificatessl证书的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证书
web界面进行操作
redfish接口,见Redfish接口调整章节
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命令进行校验即可
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下游使用相关
如果使用证书文件,ca证书可以在/data/trust/cert/ca下获取,ssl证书可以在/data/trust/cert/ssl下获取
如果需要使用证书资源树,ca证书可以在**/bmc/kepler/Managers/1/Certificates/下获取,ssl证书可以在/bmc/kepler/Managers/1/NetworkProtocol/HTTPS/Certificates/1**下获取
如果需要获取证书链信息,可以使用如下接口:
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如果需要获取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命令:
查看证书服务资源信息
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