如何为同一个通用名称颁发多个证书?

我正在为Intranet创build一个证书颁发机构。

我已经生成了根和中间CA,并使用中间CA成功签署了服务器证书。 服务器证书有CN=mysite.com

在将来,这个服务器证书将过期,我将需要发布一个新的。 但是,如果我使用相同的CN=mysite.com创build另一个CSR,那么当我签署它时,我会得到

 failed to update database TXT_DB error number 2 

如果我使用不同的CN创build一个新的CSR,这个错误就会消失,但是CN必须是相同的,否则浏览器不会说这是有效的,对吗?

我该如何解决?

编辑:我正在按照本指南 – 一切都很好,直到链接页面结束,但是当我尝试重复此页上的步骤来创build第二个证书,openssl要求我给新的证书一个不同的CN。

 SUBJ="/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=$CN" # Generate CSR echo "$PW" | openssl req \ -config "$CAROOT/intermediate/openssl.cnf" \ -new -sha256 -subj "$SUBJ" -passin stdin \ -key "$PRIV_ENC" -out "$CSR_INT" >/dev/null 2>&1 || { >&2 echo "Could not openssl req"; exit 1; } # Sign CSR openssl ca \ -config "$CAROOT/intermediate/openssl.cnf" \ -batch -extensions server_cert \ -days "$HTTP_DAYS" -notext -md sha256 \ -in "$CSR_INT" -out "$CRT_INT" || { >&2 echo "Could not openssl ca"; exit 1; } 

这是失败的openssl ca

你需要傻瓜吗? 传统上,浏览器和客户端要求主题名称的CommonName 字段与主机名匹配; 现代人更喜欢主题替代名称(SAN) 扩展名中的条目。 你可以设置其他字段不同,例如

 O=Floo Manufacturing, OU=floo server 2016, CN=www.floo.example.com O=Floo Manufacturing, OU=floo server 2017, CN=www.floo.example.com 

并且主题DN是唯一的,即使CommonName本身不是。 或者对于现代客户,您可以www.floo.example.com放在SAN中,并使用不带CommonName的唯一主题。 但是,获得openssl来执行per-cert SAN有点不方便; 见例如https://security.stackexchange.com/questions/113484/followup-to-one-liner-to-create-cert-request-with-san

允许模糊: 官方的方式

在您的configuration文件$CAROOT/intermediate/openssl.cnf )中,转到“部分”(由带有可选空格的[somename]forms的行分隔)。 由于您没有在命令行上使用-name ,因此节名是[ca]节中的default_ca的值或默认节(位于第一个[somename]行之前的顶部); 看看你的链接可能是[CA_default] 。 添加一行

  unique_subject=no 

间距和以下# comment可选。 或者,如果你已经有一个这个项目更改和/或取消注释,但看看你的链接,你可能不会。

请参阅您的系统上的man page ca(1ssl)或configuration文件选项下的网页 。

允许欺骗: 非官方的方式

清空 (截断)传统上是index.txt的configuration的database文件,并在你的链接附近,他们显然使用它。 或者编辑该文件并删除要重新使用的主题的行 ,但是在这种情况下,您只有一个或几个,而您想要重新使用它或全部他们,所以清空文件更简单。

如果您想创build具有相同主题的多个证书,则可以更改您的configuration:

您可以在openssl.cnf中的CA部分更改(可能是[CA_default] )设置

 unique_subject = no 

但是这个设置也保存在文件index.txt.attr ,你也必须改变它。 否则,它将无法正常工作。