2、PKI基础设施:公钥基础设施原理、CA证书体系、证书生命周期管理、硬件安全模块(HSM)集成
好,咱们接着聊OTA安全。上一章讲了加密算法,这一章我们聊聊PKI。说实话,PKI这东西,刚接触时觉得挺绕的,又是证书又是CA的。但说白了,它就是一套“发身份证、查身份证、吊销身份证”的体系。在汽车OTA里,没有PKI,你根本不敢让车联网升级。
2.1 公钥基础设施原理
PKI,全称Public Key Infrastructure。我习惯把它理解成一个“数字世界的公安局”。它负责发证、验证、注销。核心就三件事:
- 身份认证:确认你是你,不是冒牌货。
- 数据加密:保证升级包在路上不被偷看。
- 数字签名:保证升级包没被篡改。
你想想看,一辆车要下载一个几百兆的固件包。如果中间人把包换了,车机直接刷了恶意代码,那后果不堪设想。PKI就是用来杜绝这种事的。
核心逻辑:非对称加密 + 数字证书 + 证书颁发机构(CA)。
车厂CA给ECU签发证书,ECU用证书签名请求。云端验证签名,车端验证云端。双向认证,缺一不可。
我在项目中遇到过一个问题:某Tier1厂商直接把私钥硬编码在MCU里。结果呢?固件被提取后,私钥泄露,整个车系的升级包都能被伪造。嗯,这就是典型的“没搞懂PKI”的后果。
2.2 CA证书体系
CA,Certificate Authority,就是那个“发证机关”。在汽车行业,CA体系通常分三层:
| 层级 | 名称 | 作用 | 安全要求 |
|---|---|---|---|
| 根CA | Root CA | 签发下级CA,是整个信任链的锚点 | 离线存储,物理隔离,HSM保护 |
| 中间CA | Sub CA | 签发终端实体证书(ECU、云端) | 在线或半离线,HSM保护 |
| 终端证书 | End Entity | 每个ECU或服务端独有的身份凭证 | 存储在设备HSM或安全元件中 |
我个人建议,根CA一定要离线。你想想,根CA私钥如果泄露,整个信任体系就崩塌了。我曾经见过一个车厂,根CA私钥就放在一个U盘里,插在服务器上。我当时就提醒他们:这U盘丢了,你们就得给所有车换证书。
证书里都包含什么?我列一下关键字段:
- 序列号:唯一标识,吊销时用
- 颁发者:谁签发的这个证书
- 有效期:从哪天到哪天
- 公钥:这个证书绑定的公钥
- 签名算法:比如ECDSA with SHA256
- 扩展字段:比如Key Usage、Extended Key Usage
避坑指南:我曾经在项目里发现,某ECU的证书有效期设了20年。这其实不合理。汽车生命周期一般10-15年,证书有效期建议设5-8年,到期前OTA更新证书。太长反而增加风险。
2.3 证书生命周期管理
证书不是发完就完事了。它有一个完整的生命周期。我把它分成六个阶段:
- 证书请求(CSR):ECU生成密钥对,把公钥和身份信息打包成CSR,发给CA。
- 证书签发:CA验证CSR信息,用CA私钥签名,生成证书。
- 证书分发:通过安全通道把证书下发到ECU。OTA升级时,云端也会下发自己的证书。
- 证书使用:ECU用证书签名请求,云端用证书验证签名。双向认证。
- 证书更新:证书快过期时,通过OTA下发新证书。这个过程要保证无缝切换。
- 证书吊销:私钥泄露或ECU退役时,把证书加入CRL(证书吊销列表)。
这里有个关键点:证书吊销。在汽车场景下,CRL不能太大。一辆车可能有几十个ECU,每个ECU都要存CRL。如果CRL有几十兆,ECU那点Flash根本扛不住。我建议用增量CRL或者OCSP(在线证书状态协议)。
注意:OCSP在汽车上有个问题——网络延迟。车在高速上跑,突然要查证书状态,结果网络断了,升级就卡住了。我个人更倾向于用短有效期证书 + 增量CRL的组合方案。证书有效期短(比如7天),到期自动更新,CRL只记录最近吊销的证书。
代码示例:生成CSR的伪代码
// 生成密钥对
KeyPair keyPair = KeyPairGenerator.generate(Algorithm.ECDSA, 256);
// 构建证书请求
CSRBuilder builder = new CSRBuilder();
builder.setSubject("CN=ECU_12345, O=OEM_A, C=CN");
builder.setPublicKey(keyPair.getPublic());
builder.setExtensions(
new KeyUsageExtension(KeyUsage.DIGITAL_SIGNATURE),
new ExtendedKeyUsageExtension("1.3.6.1.5.5.7.3.8") // OTA专用OID
);
// 用私钥签名CSR
byte[] csr = builder.sign(keyPair.getPrivate(), "SHA256withECDSA");
// 发送CSR到CA
sendToCA(csr);
2.4 硬件安全模块(HSM)集成
HSM,说白了就是一个“防拆的保险柜”。私钥不能裸奔,必须放在HSM里。在汽车上,HSM可以是独立的芯片,也可以是集成在MCU/SoC里的安全岛。
我建议的集成方案是这样的:
- 密钥生成:在HSM内部生成密钥对,私钥永远不出HSM。
- 签名操作:把待签名的数据传给HSM,HSM内部签名,返回签名值。
- 证书存储:证书可以放在外部Flash,但私钥必须锁在HSM里。
- 安全通道:HSM和主核之间用安全通信协议,防止侧信道攻击。
我记得有一次,客户问能不能把私钥放在文件系统里,用的时候再读出来。我说不行。为什么呢?你想想,如果攻击者拿到了文件系统的读取权限,私钥就没了。HSM的好处是,即使攻击者物理接触了芯片,也很难提取私钥。
HSM集成要点:
- HSM必须支持ECC和RSA算法,推荐ECC P256或P384
- HSM内部要有真随机数发生器(TRNG),用于生成密钥
- HSM要支持安全存储,防止物理攻击(如探针、激光)
- HSM和主核之间的通信要加密,防止中间人攻击
实际项目中,HSM的集成往往是最头疼的。为什么呢?因为HSM厂商的SDK通常很封闭,调试起来很麻烦。我曾经花了两周时间,就为了调通HSM和主核之间的SPI通信。最后发现是时钟配置不对。嗯,这种坑踩多了,你就知道HSM集成一定要提前做,别等到最后才搞。
个人经验:HSM选型时,一定要看它是否支持OTA场景下的密钥轮换。有些老旧的HSM,密钥写进去就改不了,那OTA更新证书时就尴尬了。我建议选支持“密钥槽动态分配”的HSM,这样可以在运行时更新密钥。
最后总结一下:PKI是OTA安全的基石。CA体系要分层,根CA要离线。证书生命周期要管理好,吊销机制要轻量。HSM是私钥的最终归宿,别让私钥裸奔。下一章我们聊聊安全启动和固件验证,那是PKI在车端的落地场景。