从可信的来源更新镜像

现在越来越重要的是,设备不仅要能安全地进行更新操作,

而且要能够验证发送的图像是否来自一个已知的源, 并且没有嵌入恶意软件。

为了实现这个目标,SWUpdate必须验证传入的镜像。

有几种方法可以做到这一点。

这里有一些问题,完整的复合镜像需要签名吗?还是只是它的某些部分需要?

不同做法的优缺点将在下一章中描述。

对复合镜像进行签名

一个直接了当的做法是对整个复合镜像进行签名。但是。这样做有一些严重

的缺点。这会导致无法在加载完整个复合镜像之前对镜像进行验证。

这意味着,校验需要在安装了镜像之后才进行,而不是在实际写入设备

之前就能进行。

这会导致,如果校验失败,需要对已经安装好的镜像做一些取消安装的操作,

这种取消安装的操作,在碰到掉电时,可能会导致一些不希望保留的数据被保留在设备上。

对子镜像进行签名

如果每个子图像都签名了,验证就可以在操作相应的硬件之前完成。

只有签名正确的镜像会被实际安装。

不过这样存在一个问题,子镜像没有跟sw-descrription文件中的发布描述绑定到一起。

即使sw-description也做了签名,即使对sw-description进行了签名,攻击者也可以

将签名子镜像们混合在一起,生成可以安装的新的复合镜像,因为所有子镜像都可通过验证。

对sw-description进行签名并与哈希验证相结合

为了避免所描述的缺点,SWUpdate将签名的sw-description与每个子镜像的哈希验证结合起来。

这意味着只有经过验证的源代码生成的sw-description才能被安装程序接受。

而sw-description包含每个子镜像的哈希值,可验证每个交付的子镜像确实属于本次发布。

算法的选择

可以通过menuconfig选择签名和验证sw-descrription文件的算法。

目前,实现了以下机制:

  • RSA 公钥/私钥。 私钥属于编译系统,而公钥需要被安装到设备上。
  • 使用证书的CMS

密钥或证书使用"-k"参数传递给SWUpdate。

生成密钥/证书的工具

openssl 工具用于生成密钥。这是OpenSSL项目的一部分。完整的文档可以 在

openSSL 网站

上找到

使用 RSA PKCS#1.5

生成私钥和公钥

首先,需要生成私钥

openssl genrsa -aes256 -out priv.pem

这里需要一个密码。可以从文件中去获取这个密码 - 当然,

这个密码文件必须保护好,防止被入侵。

openssl genrsa -aes256 -passout file:passout -out priv.pem

使用如下命令,从私钥导出公钥:

openssl rsa -in priv.pem -out public.pem -outform PEM -pubout

"public.pem" 包含了适用于swupdate的格式的密钥。

该文件可以通过-k参数在命令行传递给swupdate。

如何使用RSA进行签名

对镜像进行签名非常简单:

openssl dgst -sha256 -sign priv.pem sw-description > sw-description.sig

与证书和CMS一起使用

生成自签名证书

openssl req -x509 -newkey rsa:4096 -nodes -keyout mycert.key.pem \
-out mycert.cert.pem -subj "/O=SWUpdate /CN=target"

有关参数的更多信息,请参阅文档。 "mycert.key.pem" 包含了私钥,用于签名。

不能 被部署到目标设备上。

目标设备上必须安装有 "mycert.cert.pem" - 这将被SWUpdate用于完成校验。

使用PKI颁发的证书

也可以使用PKI签发的代码签名证书。

不过,SWUpdate是使用OpenSSL库来处理CMS签名的,该库要求在签名证书上设置以下属性:

keyUsage=digitalSignature
extendedKeyUsage=emailProtection

如果不能满足此要求,也可以完全禁用签名证书密钥检查。 这是由

CONFIG_CMS_IGNORE_CERTIFICATE_PURPOSE 配置选项控制的。

如何用CMS签名

对镜像进行签名,跟前一种情况一样很简单:

openssl cms -sign -in  sw-description -out sw-description.sig -signer mycert.cert.pem \
-inkey mycert.key.pem -outform DER -nosmimecap -binary

构建签名的SWU镜像

有两个文件,sw-description和它的签名sw-description.sig。

签名文件必须紧跟在描述文件后面。

sw-description中的每个图像必须具有 "sha256" 属性,

即镜像的sha256校验和。如果有一个镜像不具有sha256属性,

则整个复合镜像的的校验结果会是未通过,SWUpdate在开始安装之前会停止并报错。

创建签名镜像的简单脚本可以是:

#!/bin/bash

MODE="RSA"
PRODUCT_NAME="myproduct"
CONTAINER_VER="1.0"
IMAGES="rootfs kernel"
FILES="sw-description sw-description.sig $IMAGES" #if you use RSA
if [ x"$MODE" == "xRSA" ]; then
openssl dgst -sha256 -sign priv.pem sw-description > sw-description.sig
else
openssl cms -sign -in sw-description -out sw-description.sig -signer mycert.cert.pem \
-inkey mycert.key.pem -outform DER -nosmimecap -binary
fi
for i in $FILES;do
echo $i;done | cpio -ov -H crc > ${PRODUCT_NAME}_${CONTAINER_VER}.swu

签名镜像的sw-description示例

本例应用于Beaglebone,安装Yocto images:

software =
{
version = "0.1.0"; hardware-compatibility: [ "revC"]; images: (
{
filename = "core-image-full-cmdline-beaglebone.ext3";
device = "/dev/mmcblk0p2";
type = "raw";
sha256 = "43cdedde429d1ee379a7d91e3e7c4b0b9ff952543a91a55bb2221e5c72cb342b";
}
);
scripts: (
{
filename = "test.lua";
type = "lua";
sha256 = "f53e0b271af4c2896f56a6adffa79a1ffa3e373c9ac96e00c4cfc577b9bea5f1";
}
);
}

对签名镜像运行SWUpdate

验证是通过在SWUpdate的配置中设置CONFIG_SIGNED_IMAGES激活的。

一旦激活,SWUpdate将始终检查复合图像。

出于安全原因,不可能在运行时禁用检查。

-k参数(公钥文件)是必须的,如果公钥没有传递,程序将终止运行。

本文地址 https://www.cnblogs.com/zqb-all/p/10296719.html

译自 swupdate 文档 https://sbabic.github.io/swupdate/signed_images.html

有更新会在github上发布 https://zqb-all.github.io/swupdate/signed_images.html

【swupdate文档 五】从可信的来源更新镜像的更多相关文章

  1. 朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素

    朱晔的互联网架构实践心得S1E9:架构评审一百问和设计文档五要素 [下载文本PDF进行阅读] 本文我会来说说我认为架构评审中应该看的一些点,以及我写设计文档的一些心得.助你在架构评审中过五关斩六将,助 ...

  2. 【swupdate文档 四】SWUpdate:使用默认解析器的语法和标记

    SWUpdate:使用默认解析器的语法和标记 介绍 SWUpdate使用库"libconfig"作为镜像描述的默认解析器. 但是,可以扩展SWUpdate并添加一个自己的解析器, ...

  3. 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级

    SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...

  4. 【swupdate文档 二】许可证

    许可证 SWUpdate是免费软件.它的版权属于Stefano Babic和其他许多贡献代码的人(详情请参阅实际源代码和git提交信息). 您可以根据自由软件基金会发布的GNU通用公共许可证第2版的条 ...

  5. 【swupdate文档 一】嵌入式系统的软件管理

    嵌入式系统的软件管理 嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加. 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新. 在基于linux的系统上,我们 ...

  6. ELK学习总结(2-4)bulk 批量操作-实现多个文档的创建、索引、更新和删除

    bulk 批量操作-实现多个文档的创建.索引.更新和删除 ----------------------------------------------------------------------- ...

  7. 获取网页文档的URL和连接来源

    <script type="text/javascript">document.write("链接来源:"+document.referrer+&q ...

  8. MongoDB的学习--文档的插入、删除和更新

    最近在看<MongoDB权威指南>,写博客记录一下相关内容~~ 关于安装之类的最基本的就不多说了,从基本操作增删改查开始. MongoDB官网地址:http://www.mongodb.o ...

  9. Mybatis文档阅读笔记(明日继续更新...)

    今天在编写mybatis的mapper.xml时,发现对sql的配置还不是很熟,有很多一坨一坨的东西,其实是可以抽取成服用的.不过良好的组织代码,还是更重要的.

随机推荐

  1. IPv4编址及子网划分

    在讨论IP编址之前,我们需要讨论一下主机与路由器连入网络的方法.一台主机通常只有一条链路链接到网络:当主机中的IP想发送一个数据报时,它就在链路上发送,主机与物理链路之间的边界叫做接口(interfa ...

  2. ARP(Adress Resolution Protocol): 地址解析协议

    地址解析协议(Address Resolution Protoclol),其基本功能为通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利.它是IPV4中网络层必不可少的协议.不过在IP ...

  3. 第197天:js---caller、callee、constructor和prototype用法

    一.caller---返回函数调用者 //返回函数调用者 //caller的应用场景 主要用于察看函数本身被哪个函数调用 function fn() { //判断某函数是否被调用 if (fn.cal ...

  4. bzoj1031-字符加密

    环的问题,经典方法倍长串,求出后缀数组,扫一次sa,如果sa[i]小于等于n,那么就输出这个字符串结尾的位置(即s[sa[i]+n-1]). 代码 #include<cstdio> #in ...

  5. 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包

    题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...

  6. 【JavaScript&jQuery】省市区三级联动

    HTML: <%@page import="com.mysql.jdbc.Connection"%> <%@ page language="java&q ...

  7. BZOJ3712 PA2014Fiolki(kruskal重构树)

    对合并过程建树.然后只需要按照时间顺序考虑每个反应就行了,时间顺序根据lca的深度确定. #include<iostream> #include<cstdio> #includ ...

  8. C++解析-外传篇(3):动态内存申请的结果

    0.目录 1.动态内存申请一定成功吗? 2.new_handler() 函数 3.小结 1.动态内存申请一定成功吗? 问题: 动态内存申请一定成功吗? 常见的动态内存分配代码: C代码: C++代码: ...

  9. 【BZOJ4802】欧拉函数(Pollard_rho)

    [BZOJ4802]欧拉函数(Pollard_rho) 题面 BZOJ 题解 这么大的范围肯定不好杜教筛. 考虑欧拉函数的计算式,显然只需要把\(n\)分解就好了. 直接\(Pollard\_rho\ ...

  10. 【BZOJ4755】扭动的回文串(Manacher,哈希)

    [BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...