我想创建一个带有特定公钥的证书。我有另一个包含我需要使用的公钥的证书,并且我希望将该证书上的签名更改为我制作的根 CA。
我知道如何获取公钥的十六进制表示形式,但是 OpenSSL 在创建签名证书时需要编码文件作为输入。
当我只有由不同 CA 签名的现有证书时,如何向 OpenSSL 提供创建新证书所需的输入公钥文件?
答案1
这是一个相当奇怪的功能,但 OpenSSL 命令行确实可以“重新签署”现有证书。
openssl x509 -in oldcert -CA cacertfile [-CAkey capkeyfile] -out newcert -days N
CA 证书和私钥必须(两者)都是 PEM 格式;您可以将私钥包含在证书文件中并省略该-CAkey file
选项。如果省略,则-days N
有效期默认为 30 天。oldcert 和 newcert 默认为 PEM,但可以分别使用-inform
和进行更改-outform
。
如果你只做一次,最简单的方法是用于-set_serial S
新的串行-CAcreateserial
。如果您将或可能为一个 CA 多次执行此操作,为了确保每个 CA 获得唯一的序列号,请至少在第一个 CA 上指定 OpenSSL 使用其序列计数器文件。
默认情况下扩展保持不变。如果 oldcert 具有指向旧 CA 的 AuthorityKeyIdentifier 扩展,而新 CA 不同,这将导致生成的证书不可用,因为它无法验证。其他与 CA 相关的扩展(如 CRLDP 和 AIA)也可能导致问题。用于删除旧扩展;如果您确实需要新证书中的(任何)扩展,则必须在使用 和(可选)(部分)-clrext
指定的文件中配置它们(全部) 。-extfile
-extensions
看https://www.openssl.org/docs/apps/x509.html#SIGNING-OPTIONS(如果需要扩展,请点击 x509v3_config 链接)。-CA
“... 如果没有 -req 选项,输入... 必须是自签名的”下的警告被夸大了;如果不是,openssl 会给出“无法验证”的错误消息,但会按要求创建新证书。此外,发布1.0.1 之前 f 有一个 bug这会导致这种情况产生错误的输出;请确保您不使用其中一个版本。
正如已经指出的那样,除非您在某处(可能是在不同的系统/应用程序/其他地方)拥有匹配的私钥,否则生成的证书的实用性非常有限。