我很难理解openSSL的签名和验证过程。
我的证书层次很小:根证书=>子证书=>最终实体证书。 我想从最终实体CA获得代码签名证书,因此创建了密钥对并请求了CSR:
openssl genrsa -out key.pem
...
openssl genrsa -pubout -in key.pem -out key.pub.pem
...
openssl req -new -sha256 -key key.pem -out id.csr
...
我发送我的CSR并收到存储在cert.pem中的代码签名证书。 我的理解是,该证书仅用于验证目的(验证签名),我的代码应使用私钥(key.pem)签名:
openssl dgst -sha256 -sign key.pem -out program.sign program
因此,我有一个用key.pem签名的program.sign。然后,考虑到我有4个用于路径验证的证书:root.pem,sub.pem,end.pem,cert.pem。
我如何要求openssl使用链中的多个证书来验证签名以进行检查?
我尝试了此操作,但是它当然不起作用,因为我只指定了代码签名证书,而没有链的其余部分:
openssl dgst -sha256 -verify program -signature program.sign cert.pem
undable to load key file
我想念什么吗?
非常感谢您。
答案 0 :(得分:0)
大部分是受骗verifying a file signature with openssl dgst
您的描述有点混乱;我将“最终实体CA”解释为是发出 EE证书的CA,因为EE不是CA,CA不是EE,而您所谓的“最终实体证书”实际上不是最终实体的证书。具体来说,我认为您的cert.pem
是由 CA 颁发的证书,其证书位于end.pem
中,并使用相应的私钥,因此root.pem sub.pem end.pem cert.pem
的形式实际上是认证路径又称链。
openssl dgst -verify
甚至不拿证书,更不用说验证证书了。它仅使用 publickey ,并使用它来验证数据上的签名-或选择使用私有密钥并派生出公共密钥并使用它,但是通常,验证签名的一方不会且不应这样做有私钥。如果要使用命令行来验证针对证书链的签名,则需要按照两种顺序执行以下两项操作:
使用openssl verify
来验证证书链;您可以使用-untrusted
(作为一个文件,在您的情况下为cat sub.pem end.pem
)提供中间证书,也可以在所使用的信任库中提供中间证书(以及根)。是您创建并指定的一个,或者原则上可以是默认值(但这通常是系统范围的,不明智地进行更改)。参见Verify a certificate chain using openssl verify和Openssl verify with chained CA and chained Cert(公开:我的)。
使用openssl x509 -pubkey -in cert.pem -out pubkeyfile
从叶子证书中获取公钥,并使用它来验证数据上的签名,为此您必须在选项之后 指定数据文件,或者其他作为标准输入,请参见下文。
(没有这些伪文本,我将无法正确获取这些格式)
openssl dgst -sha256 -verify pubkeyfile -signature program.sign program
openssl dgst -sha256 -verify pubkeyfile -signature program.sign <program