我们拥有自己的 OpenVPN 服务器 CA 基础设施。我们创建了一个自签名根 CA,然后为每个 OpenVPN 进程/网络创建了一个中间 CA。我们使用以下命令创建中间 CA:
openssl req -new -batch -days 3650 -newkey rsa:2048 -nodes sha256 -keyout network.hostname.ca.key -out sign_request.csr -subj "/C=land/ST=region/L=town/O=org/OU=CAnetwork/CN=cn/emailAddress=email" -config /path/to/config
openssl ca -cert root.ca.crt -keyfile root.ca.key -in sign_request.csr -out network.hostname.ca.crt -noemailDN -md sha256 -extensions v3_ca -outdir /some/dir -config /path/to/config -batch
现在,我们的中间 CA 即将到期(几个月后),我想续订证书。我尝试通过运行与 10 年前完全相同的命令来做到这一点,但我使用中间 ca 的旧密钥而不是生成新密钥(因为我希望颁发的证书保持有效!)。然而,这抱怨说Serial number 01 has already been issued
。 Serial 01 是当前/即将到期的中间产品的序列号。
如何让 openssl 忽略现有的有效中间 CA 并以更长的有效期重新创建它,以便新 CA 仍将验证使用旧的过期 CA 创建的客户端证书?
答案1
在我看来,您的 CSR 生成命令是错误的:
openssl req -new -batch -days 3650 -newkey rsa:2048 -nodes sha256 -keyout network.hostname.ca.key -out sign_request.csr -subj "/C=land/ST=region/L=town/O=org/OU=CAnetwork/CN=cn/emailAddress=email" -config /path/to/config
将创建一个名为 network.hostname.ca.key 的全新密钥。如果您想真正续订,您可能需要使用现有的密钥。我认为它看起来像这样:
openssl req -new -batch -days 3650 -key network.hostname.ca.key -sha256 -out sign_request.csr -subj "/C=land/ST=region/L=town/O=org/OU=CAnetwork/CN=cn/emailAddress=email" -config /path/to/config
答案2
我认为问题是你不能拥有两个具有相同 CN 的证书同时有效。 openssl.cnf 中有一个选项允许这样做,但这不是您想要的。认为最好撤销 int ca 并使用相同的私钥和相同的属性创建一个新请求并对其进行签名。应该满足你的所有需求
发现这个链接解释得很好
https://serverfault.com/questions/306345/certification-authority-root-certificate-expiry-and-renewal
编辑:添加更多内容。似乎证书验证不仅包括颁发者 == int ca 主体颁发者序列号 #== int ca 序列号
因此,只需使用相同的详细信息更新 int ca - 您将获得不同的序列号