其实制作证书还是很简单,就是三个命令。
openssl genpkey -algorithm RSA -out private.key
openssl req -new -key private.key -out certificate.csr
openssl x509 -req -days 365 -in certificate.csr -signkey private.key -out certificate.crt
之后就会生成名字是certificate.crt的证书。
这个证书怎么使用呢?其实有很多,现在说的一个就是文件签名:
首先创建文件。
echo "This is a test message" > data.txt
然后根据之前的私钥,从这个文件生成验证证书。之后将证书发给对方。
openssl dgst -sha256 -sign private.key -out data.sig data.txt
之后根据私钥生成生成公钥并发给对方。
对方此时就拿到了文件,验证证书,还有你的公钥。
用这个命令就可以验证:
openssl dgst -sha256 -verify public.key -signature data.sig data.txt
如果没有篡改,就是OK。反之则失败。
写这个还是因为之前Android的Secure Boot,两者本质上一样。但是实际命令可能会复杂一些。
在出厂之前,生产方会用私钥对bootloader,分区这些做签名。然后公钥是写死在flash中某个熔断的位置。调用之前会对这些分区进行校验,就像上面的Verify OK之后才下一步。就保证了这些内容不会被篡改。
有一个小疑问,假如签名,目标文件都改了,那么可以校验通过吗?GPT答复是不会,因为做签名要私钥,如果这个私钥和公钥不匹配,也是不会通过的。所以在设备上,包整公钥不能被更改就欧了。
最后附一个RSA证书校验流程的图。