2. 生成ECDSA密钥对并保存为PEM格式

任务目标

使用OpenSSL生成P-256(prime256v1)曲线的ECDSA私钥与公钥,分别保存为PEM格式文件,并通过签名与验签操作验证密钥对的正确性。

环境依赖

需要OpenSSL命令行工具(版本1.1.1或更高,支持P-256曲线)。Linux/macOS通常预装,Windows可安装OpenSSL二进制包。验证命令:openssl version。

实现步骤与代码

以下命令依次完成密钥生成、公钥提取、签名与验签。全部命令在终端中执行,无需编写程序代码。

# 1. 生成P-256 ECDSA私钥(PEM格式,PKCS#8)
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem

# 2. 从私钥提取对应公钥(PEM格式,SubjectPublicKeyInfo)
openssl ec -in private_key.pem -pubout -out public_key.pem

# 3. 创建待签名数据文件
echo "Secure Boot Image v1.0" > data.txt

# 4. 使用私钥对数据签名(生成二进制签名文件)
openssl dgst -sha256 -sign private_key.pem -out signature.bin data.txt

# 5. 使用公钥验证签名
openssl dgst -sha256 -verify public_key.pem -signature signature.bin data.txt

验证方法与判定标准

执行第5步验签命令后,终端输出 Verified OK 即表示密钥对正确、签名有效。若输出 Verification Failure,则说明密钥不匹配或数据被篡改。

可额外检查生成的文件内容:

# 查看私钥文件头(应包含BEGIN EC PRIVATE KEY或BEGIN PRIVATE KEY)
head -1 private_key.pem

# 查看公钥文件头(应包含BEGIN PUBLIC KEY)
head -1 public_key.pem

# 查看密钥曲线参数
openssl ec -in private_key.pem -text -noout | head -3

预期输出:私钥文件头为 -----BEGIN PRIVATE KEY-----(PKCS#8格式),公钥文件头为 -----BEGIN PUBLIC KEY-----,曲线信息显示为 ASN1 OID: prime256v1。

常见问题

  • 私钥文件头为EC PRIVATE KEY:若使用openssl ecparam -genkey未加-noout参数,会输出SEC1格式。本案例使用-noout确保PKCS#8格式,兼容性更好。
  • 签名验证失败:确认签名与验签使用同一份data.txt文件,任何字节修改都会导致验证失败。
  • 权限设置:私钥文件应设置严格权限(如chmod 600 private_key.pem),防止未授权读取。

文件用途说明

生成的private_key.pem用于固件签名(离线安全环境),public_key.pem可嵌入设备端用于验签。本案例生成的密钥对可直接用于后续固件签名流程。