nordic ncs 使用自定义秘钥进行固件进行签名
一、自定义密钥固件签名的核心作用
1. 安全启动(Secure Boot)验证
MCUboot 在启动固件前会验证其数字签名,确保:
固件未被篡改:任何修改都会导致签名失效,系统拒绝启动
固件来源可信:只有用您的私钥签名的固件才能运行,防止恶意代码注入
2. 防篡改保护
攻击者无法修改固件后重新签名(没有私钥)
防止通过物理攻击(如 JTAG/SWD)直接修改 Flash 中的固件
保护知识产权,防止固件被逆向分析后篡改
3. OTA 升级安全性
升级包验证:OTA 下载的固件必须用您的私钥签名
防止降级攻击:可以配合版本号机制,阻止刷入旧版本不安全的固件
中间人攻击防护:即使传输通道被劫持,攻击者也无法伪造有效签名
4. 身份认证
固件带上您的数字签名,证明是官方发布版本
用户可以放心升级,避免安装来路不明的固件
5. 双密钥机制(公钥+私钥)
私钥(保密):开发人员持有,用于签名固件
公钥(内置):编译时嵌入 MCUboot,用于验证签名
即使设备被破解,公钥无法推导出私钥,不影响其他设备安全
二、基于NCS开发环境修改默认密钥步骤
1. 生成密钥
比较常用的方式是使用openssl生成加密密钥,如果你电脑中有GIT工具,那么将C:\Program Files\Git\usr\bin目录添加到环境变量中,就可以使用openssl了。

添加后,在项目目录中新建一个KEY目录(最好与项目工程目录分开),在该目录下CMD运行
openssl help
应该有如下界面显示,代表openssl环境是OK的。

然后我们在KEY目录下生成ECDSA私钥:
# 1. 生成 ECDSA P256 私钥
openssl ecparam -name prime256v1 -genkey -noout -out private.pem
# 2. (可选) 查看生成的私钥信息
openssl ec -in private.pem -text -noout
# 3. 生成对应的公钥(用于验证)
openssl ec -in private.pem -pubout -out public.pem
2. 配置项目
在项目根目录创建(若无)\child_image目录,添加mcuboot.conf文件,在文件中添加以下配置:
CONFIG_BOOT_BOOTSTRAP=n
CONFIG_BOOT_ENCRYPT_RSA=n
#CONFIG_BOOT_SIGNATURE_TYPE_RSA=y
CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y
CONFIG_BOOT_SIGNATURE_KEY_FILE="D:/1_PRJ/5_Key/private.pem"
在跟目录下的sysbuild.conf(使用sysbuild编译)添加以下配置:
SB_CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y
#SB_CONFIG_BOOT_SIGNATURE_TYPE_RSA=y
SB_CONFIG_PM_OVERRIDE_EXTERNAL_DRIVER_CHECK=y
SB_CONFIG_BOOT_SIGNATURE_KEY_FILE="D:/1_PRJ/5_Key/private.pem"
3. 验证升级

先烧录刚刚的固件,然后改一改蓝牙广播名字,再次建立工程。然后依然是在建立的工程目录下build_5340\zephyr(build_5340是我自定义的编译输出文件的名字,和自己定义的进行匹配),找到app_update.bin,发送到手机上,然后打开手机连接上设备。
可以看到设备现在名字是NORDIC_TEST,点击DFU,开始选择升级固件,直至成功即可。

浙公网安备 33010602011771号